首页 文章

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

提问于
浏览
2

问题

从2006年开始,我有一个带有time series数据的pandas DataFrame五年,我添加 PeriodIndex ,它自动转换自 Period ,由pd.period_range()制作,如下面的代码块所示 .

在那里,我想要resample()前四年,我已经使用了docs中提到的time series offset aliases . 当我使用 freq=1W 时它可以工作,但是例如频率为2(或同样为3周)我得到一个错误

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

Periods part of the time series docs中提到它并且它说:

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

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

错误的一般形式是,如果我的 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 .

尝试(s)

# 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 相同 .

其他想法

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

根据this answer,以下是一种更好的方法:

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

但这给了我一个 InvalidIndexError: Reindexing only valid with uniquely valued Index objects . (我假设在阳光节省时间从夏季到冬季的重复索引值 . )

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

虽然SO上有几篇关于重新取样的帖子,但我搜索了"IncompatibleFrequency""Input has different freq",但似乎没有其他帖子 .

这个问题

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

1 回答

  • 1

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

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

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

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

相关问题