为什么pandas时间序列重新采样会引发IncompatibleFrequency错误?

时间:2018-02-21 00:20:22

标签: python pandas time-series resampling

问题

从2006年开始,我有一个带有time series数据的pandas DataFrame五年,我添加了一个PeriodIndex,该Period会自freq=1W转换为IncompatibleFrequency: Input has different freq=2W-SUN from PeriodIndex(freq=W-SUN) 在下面的代码块中看到。

在那里,我想要pd.period_range()前四年,我已经使用了resample()中提到的time series offset aliases。当我使用freq=XY时,它有效,但是例如频率为2(或同样为3周)我收到错误

Input has different freq=XY from PeriodIndex(freq=Y)

docs中提及,它说:

  

从句点中加上和减去整数会使句点按其自己的频率移动。在具有不同频率(span)的Period之间不允许算术。

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

错误的一般形式是,如果我的X提供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') 为1。

数据

原始数据集来自具有多列的csv文件,但在示例中,我只有一列具有相同行数的列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')

现在,如果我在ipython类型# 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

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

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

尝试

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相同。

其他想法

显然某些时期不会起作用,但对于几年半小时的数据,我预计可以产生任意较小的频率,如任意小时数,数天,数周或数月

根据Periods part of the time series docs,以下是更好的方法:

string url = $"{PSID}?fields=first_name,last_name,email&access_token{accessToken}";       

但这给了我一个{{1}}。 (我假设在阳光节省时间从夏季到冬季的重复索引值。)

此外,我的印象是熊猫的目标是为我们做这样的“繁重”,并假设更深入的理解将使用户能够在没有这些解决方法的情况下使用它。

虽然有关SO重新取样的帖子很多,但我搜索了this answer"IncompatibleFrequency",但似乎没有其他帖子。

问题

我想了解为什么会出现错误,以及如何解决重新采样到任意时期的问题 - 或者至少要理解这些限制。

1 个答案:

答案 0 :(得分:1)

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

作为一种解决方法,在修复错误之前,您可以在绘制之前将索引转换为DatetimeIndex to_timestamp

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

请注意,您可能需要调整freq的{​​{1}}或how参数。有关这些参数的更多详细信息,请参阅文档。