使用DatetimeIndex重新采样DataFrame并保留日期范围

时间:2018-08-15 10:25:47

标签: python pandas

我的问题听起来很琐碎,但我没有找到解决方案:

当我使用DatetimeIndex对DataFrame重新采样时,我希望重新采样的数据与原始数据保持在相同的日期范围内。变成三个月的值。

最小示例:

import numpy as np
import pandas as pd

# data from 2014 to 2016
dim = 8760 * 3 + 24
idx = pd.date_range('1/1/2014 00:00:00', freq='h', periods=dim)
df = pd.DataFrame(np.random.randn(dim, 2), index=idx)

# resample two three months
df = df.resample('3M').sum()
print(df)

屈服

                     0           1
2014-01-31   24.546928  -16.082389
2014-04-30  -52.966507  -40.255773
2014-07-31  -32.580114   47.096810
2014-10-31   -9.501333   12.872683
2015-01-31 -106.504047   45.082733
2015-04-30  -34.230358   70.508420
2015-07-31  -35.916497  104.930101
2015-10-31  -16.780425   17.411410
2016-01-31   68.512994  -43.772082
2016-04-30   -0.349917   27.794895
2016-07-31  -30.408862  -18.182486
2016-10-31  -97.355730 -105.961101
2017-01-31   -7.221361   40.037358

为什么重新采样超出了日期范围,例如为2017-01-31创建一个条目,以及如何防止此情况,而是保持在原始范围内,例如在2014-01-012016-12-31之间?难道这不是从January-March, April-June, ... October-December开始的预期标准行为吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

DataFrame中有36个月的时间。

每3个月进行一次重新采样时,第一行将包含第一个月末之前的所有内容,第二行将包含第二个月至此后3个月之间的所有内容,依此类推。您的最后一行将包含从2016-10-31到此后三个月的所有内容,即2017-01-31

如果需要,可以将其更改为

df.resample('3M', closed='left', label='left').sum()

,给你

2013-10-31   3.705955  25.394287
2014-01-31  38.778872 -12.655323
2014-04-30  10.382832 -64.649173
2014-07-31  66.939190  31.966008
2014-10-31 -39.453572  27.431183
2015-01-31  66.436348  29.585436
2015-04-30  78.731608 -25.150526
2015-07-31  14.493226  -5.842421
2015-10-31  -2.394419  58.017105
2016-01-31 -36.295499 -14.542251
2016-04-30  69.794101  62.572736
2016-07-31  76.600558 -17.706111
2016-10-31 -68.842328 -32.723581

,但第一行将位于“您的范围之外”。

如果您每3个月进行一次重新采样,那么您的第一行将不在范围内,或者最后一行将不在范围内。

编辑

如果您想将垃圾箱设置为“前三个月”,“下三个月”,依此类推,则可以写

df.resample('3MS').sum()

,因为这将是每个月的开始而不是每个月的结束(请参见https://pandas.pydata.org/pandas-docs/stable/timeseries.html#timeseries-offset-aliases