Pandas 重新采样倒数的时间序列(或反向重新采样)

Posted

技术标签:

【中文标题】Pandas 重新采样倒数的时间序列(或反向重新采样)【英文标题】:Pandas resample time series counting backwards (or reverse resample) 【发布时间】:2019-01-18 03:42:07 【问题描述】:

我想重新采样一个倒数的熊猫时间序列。例如,让我们设置一个简单的 11 天时间序列:

>>> index = pd.date_range('01-01-2018', '01-11-2018', freq='D')
>>> randint = np.random.randint(low=0, high=9, size=(len(index), 1))

>>> df = pd.DataFrame(randint, index=index, columns=['random'])
>>> print(df)

            random
2018-01-01       8
2018-01-02       8
2018-01-03       1
2018-01-04       4
2018-01-05       3
2018-01-06       5
2018-01-07       2
2018-01-08       6
2018-01-09       5
2018-01-10       1
2018-01-11       3

熊猫的默认行为

如果我每 5 天重新采样一次,我会得到:

>>> df_5d = df.resample('5D').sum()
>>> print(df_5d)

            random
2018-01-01      24
2018-01-06      19
2018-01-11       3

基本上你有 3 个分组:前两个组有 5 个成员,最后一个组有 1 个成员,总共有 11 个成员:

Start        End
2018-01-01   2018-01-05
2018-01-06   2018-01-10
2018-01-11   2018-01-11

我想要的是这个

>>> df_5d = df.resample('5D').sum()
>>> print(df_5d)

            random
2018-01-01       8
2018-01-02      21
2018-01-07      17

分组如下所示。看看我是如何从最近的日期开始倒数 '5D' 的:

Start        End
2018-01-01   2018-01-01
2018-01-02   2018-01-06
2018-01-07   2018-01-11

如何对倒数的 pandas 时间序列重新采样?

【问题讨论】:

您的真实数据中是否会有缺失的日子? 另见***.com/questions/37866145/… 【参考方案1】:

你可以使用

In [452]: t = np.arange(len(df.index)-1, -1, -1) // 5

In [453]: df.reset_index().groupby(t, sort=False)['index'].agg([min, max])
Out[453]:
         min        max
2 2018-01-01 2018-01-01
1 2018-01-02 2018-01-06
0 2018-01-07 2018-01-11

【讨论】:

【参考方案2】:

解决方法可能是将原始 df 分成两部分,以便能够使用标准重采样,然后 pd.concat 两个重采样数据帧,例如:

res_interval = 5
df_res = pd.concat([df[:len(df)%res_interval].resample('D'.format(res_interval)).sum(),
                    df[len(df)%res_interval:].resample('D'.format(res_interval)).sum()])

用我的随机数,我得到:

            random
2018-01-01       1
2018-01-02      13
2018-01-07      26

【讨论】:

我认为不错的解决方案 ;) 我不得不把它分解,看看你在做什么,但这确实是一个很好的解决方案。您实际上不必向后采样,只需在 X 段块中采样,模数位于头部。这绝对应该是公认的答案,并已保存到我的项目参考资料中。 我们如何使用完整的小时、分钟和秒进行每小时重采样的日期时间?【参考方案3】:

我想我得到了一个非常简单的解决方案:

您可以按时间降序对时间序列进行排序,然后进行重新采样。

index = pd.date_range('01-01-2018', '01-11-2018', freq='D')
randint = np.random.randint(low=0, high=9, size=(len(index), 1))

df = pd.DataFrame(randint, index=index, columns=['random'])
print(df)

            random
2018-01-01       0
2018-01-02       4
2018-01-03       6
2018-01-04       8
2018-01-05       3
2018-01-06       8
2018-01-07       3
2018-01-08       4
2018-01-09       5
2018-01-10       5
2018-01-11       4

使用 label 和 closed ='right',您告诉 resample 应该在求和值的区间中考虑第一天,并且应该将其用作索引的标签。

print(df.sort_index(ascending=False).resample('5D',label='right',closed='right').sum())

random
2018-01-01       0
2018-01-06      29
2018-01-11      21

【讨论】:

以上是关于Pandas 重新采样倒数的时间序列(或反向重新采样)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 将每日数据重新采样为每月(日期格式)

pandas的resample重采样

Pandas TimeSeries 重新采样产生 NaN

用最少的观察次数对 Pandas 重新采样

pandas 重新采样以获得具有时间序列数据的月平均值

Pandas 数据框:使用线性插值重新采样