【问题标题】:Why Pandas Series resample function generated an unexpected start_time after resampling?为什么 Pandas Series 重采样函数在重采样后会产生意外的 start_time?
【发布时间】:2017-01-14 11:27:17
【问题描述】:

我在 pandas 中有一个时间序列数据,我想通过使用 pandas 指定频率的重采样函数来计算不同 bin 中的数据数量。

如果你使用的话,熊猫系列看起来像下面这样:

test_data.head(10)

您将获得结果(仅显示前 10 个数据,因为它是一个大型系列):

    Created
2015-11-29 23:28:50    KBH889
2015-11-29 23:30:43    KBH89U
2015-11-29 23:34:06    KBH88K
2015-11-29 23:38:08    KBH8CC
2015-11-29 23:38:36    KBH83T
2015-11-29 23:40:52    KBH8CF
2015-11-29 23:46:27    KBH8F1
2015-11-29 23:50:01    KBH8DQ
2015-11-29 23:54:29    KBH8FV
2015-11-29 23:58:01    KBH8C6
Name: Order_Number, dtype: object

然后我使用频率为“4541S”的重采样功能(它必须是4541s,不能更改!)

test_data.Order_Number.resample("4541S").count()

结果:

    Created
2015-11-29 22:42:18     9
2015-11-29 23:57:59    15
2015-11-30 01:13:40     6
2015-11-30 02:29:21     3
2015-11-30 03:45:02     2
Freq: 4541S, Name: Order_Number, dtype: int64

重采样结果以日期时间索引2015-11-29 22:42:18 开始。这是不需要的 start_time。我希望时间是该系列的最小值,在这种情况下,应该从2015-11-29 23:28:50 开始重新采样。有人知道怎么做这个吗?我尝试在重采样功能中使用参数base 来调整它。似乎很难。

这是用于测试的csv file。导入它并使用 count() 重新采样。

【问题讨论】:

  • count() 正在返回一个系列?是对的还是您在问题上错误地添加了.count()
  • 我对您的数据类型感到困惑。您如何重新采样非数字列?你能提供一个包含数据的 .csv 文件吗?
  • @vmg: count() 用于计算重采样数据集的数量。它确实返回了一个新的分箱时间序列。只要您的索引是 datetimeindex,您就可以重新采样任何列,我认为
  • @vmg:我附上了 csv 文件。你可以试试我的代码test_data.resample("4541S").count()
  • 好的,我现在明白了。我很好奇你是如何用.count() 得到这些结果的,答案是resample API changed in pandas version 0.18,我不熟悉。我现在可以复制你的结果了。

标签: python pandas time-series


【解决方案1】:

我认为您是正确的,因为这应该通过 base 参数来实现。不幸的是,我也找不到一种方法来轻松地使用原始的第一个 datetimeindex(在您的情况下为“2015-11-29 23:28:50”)而不是计算的(“2015-11-29 22: 42:18')。

作为一种解决方法,这可能对您的情况有所帮助,但对于其他情况并不完全有用,您可以执行以下操作:从原始数据中获取“原始”日期时间索引,从重新采样的数据中获取“计算”的第一个日期时间索引:

original = test_data.index[0]
calculated = test_data.Order_Number.resample('4541S',how='count',base=0).index[0]

(注意我使用的是 pandas 0.17 resample API - 您可能需要应用 .count() 而不是使用 'how' 参数)

然后得到“计算”的第一个 datetimeindex 和原始第一个 datetimeindex 之间的秒差:

base_seconds = int((original - calculated).seconds)

最后,使用base_seconds 作为base 参数的值:

test_data.Order_Number.resample('4541S',how='count',base=base_seconds)

产量

Created
2015-11-29 23:28:50    19
2015-11-30 00:44:31    10
2015-11-30 02:00:12     3
2015-11-30 03:15:53     3
Freq: 4541S, Name: Order_Number, dtype: int64

我希望这会有所帮助。

【讨论】:

  • 是的。这也是我找到的解决方案。谢谢!希望 pandas 能发布更好的重采样函数,基础用法更清晰。
猜你喜欢
  • 2020-07-20
  • 2016-01-26
  • 2013-02-06
  • 2022-01-04
  • 2020-11-06
  • 2021-11-23
  • 2013-06-09
  • 2021-03-05
  • 2012-07-31
相关资源
最近更新 更多