Python 熊猫重新采样时间序列向后计数(或反向重新采样)

Python 熊猫重新采样时间序列向后计数(或反向重新采样),python,pandas,time-series,resampling,Python,Pandas,Time Series,Resampling,我想对熊猫的时间序列重新采样,倒数计时。例如,让我们设置一个简单的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, col

我想对熊猫的时间序列重新采样,倒数计时。例如,让我们设置一个简单的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
我想要的是这个 分组如下所示。请参见我如何从最新日期开始向后计算
'5D'

Start        End
2018-01-01   2018-01-01
2018-01-02   2018-01-06
2018-01-07   2018-01-11
如何对反向计数的熊猫时间序列重新采样?

您可以使用

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

一种解决方法是将原始的
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

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

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

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

您的真实数据中是否会丢失每一天?另外,请参阅我认为很好的解决方案;)我不得不把它分解,看看你到底在做什么,但这确实是一个很好的解决方案。你不需要倒着采样,只需在X段块中采样,模头处有模。这绝对应该是被接受的答案,并已保存到我的项目参考中。我们如何在datetime中使用完整的小时、分钟和秒进行每小时重新采样?
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