为什么熊猫时间序列重采样引发不兼容频率错误?



问题

我有一个 pandas DataFrame,其中包含从 2006 年开始的五年时间序列数据,我在其中添加了一个PeriodIndex,该从使用pd.period_range()制作的Period自动转换,如下面的代码块所示。

在那里,我想resample()前四年,并且使用了文档中提到的时间序列偏移别名。当我使用freq=1W它可以工作时,但是例如频率为 2(或同样为 3 周),我收到一个错误,说

IncompatibleFrequency: Input has different freq=2W-SUN from PeriodIndex(freq=W-SUN)

在时间序列文档的周期部分中提到了这一点,它说:

从句点

中添加和减去整数会按其自身的频率移动句点。不同频率(跨度)的周期之间不允许算术。

老实说,我不确定这与我的问题有什么关系。

错误的一般形式是,如果我freq=XY,它给出Input has different freq=XY from PeriodIndex(freq=Y),除非X是1。

数据

原始数据集来自具有多列的 csv 文件,但在示例中,我只有一个行数相同的单列A

import pandas as pd
# dummy DataFrame with 87648 rows
df = pd.DataFrame(dict(A=np.random.randint(1, 101, size=87648)))
# Add periods column, set as index
df['time'] = pd.period_range(start='2006-01-01 00:30', freq='30min', end='2011-01-01')
df = df.set_index('time')

现在,如果我在例如 ipython 类型中df.index我会得到以下输出:

PeriodIndex(['2006-01-01 00:30', '2006-01-01 01:00', '2006-01-01 01:30',
'2006-01-01 02:00', '2006-01-01 02:30', '2006-01-01 03:00',
'2006-01-01 03:30', '2006-01-01 04:00', '2006-01-01 04:30',
'2006-01-01 05:00',
...
'2010-12-31 19:30', '2010-12-31 20:00', '2010-12-31 20:30',
'2010-12-31 21:00', '2010-12-31 21:30', '2010-12-31 22:00',
'2010-12-31 22:30', '2010-12-31 23:00', '2010-12-31 23:30',
'2011-01-01 00:00'],
dtype='period[30T]', name='time', length=87648, freq='30T')

这似乎符合我的期望,并与加载它的 csv 文件中的数据相匹配:

  • 有 87648 行。
  • 第一个时间戳是 2006-01-01 00:30。
  • 最后时间戳是 2011-01-01 00:00。

尝试

# This works
df['A'].loc['2006':'2009'].resample('1W').mean().plot()
# This gives error mentioned above
df['A'].loc['2006':'2009'].resample('2W').mean().plot()

进一步:

  • 如果我尝试使用freq=6M,我会遇到同样的问题,但是如果我这样做freq=1M它就可以工作。(Input has different freq=6M from PeriodIndex(freq=M))
  • 它也失败了7D,根据我的期望,这应该与1W相同。

其他想法

显然,在某些情况下,某些时间段不起作用,但是对于几年的半小时数据,我希望有可能产生任何较小的频率,例如任意数量的小时,天,周或月。

根据这个答案,以下是一个更好的方法:

df['A'].resample('D').interpolate()[::7]

但这给了我一个InvalidIndexError: Reindexing only valid with uniquely valued Index objects.(我假设在阳光保存时间期间,从夏季到冬季的几个小时有重复的索引值。

此外,我的印象是熊猫旨在为我们做这种"繁重的工作",并假设更深入的理解将使用户能够在没有此类解决方法的情况下使用它。

虽然SO上有几个关于重采样的帖子,我已经搜索了"不兼容的频率"和"输入有不同的频率",但似乎没有其他帖子。

问题

我想了解为什么会引发错误,以及如何解决重新采样到任意周期的问题 - 或者至少了解限制。

> 这是一个plot()的错误,而不是resample(),已在 GitHub (#14763) 上报告。

作为修复错误之前的解决方法,您可以在绘制之前将索引转换为具有to_timestampDatetimeIndex

df.loc['2006':'2009', 'A'].resample('2W').mean().to_timestamp().plot()

请注意,您可能需要调整to_timestampfreqhow参数。 有关这些参数的其他详细信息,请参阅文档。

最新更新