我的问题可能听起来微不足道,但我还没有找到任何解决方案:
当我使用 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-01
和 2016-12-31
之间?这不应该是一月至三月、四月至六月、...十月至十二月
的预期标准行为吗?
提前致谢!
最佳答案
您的 DataFrame 中有 36 个月。
当您每 3 个月重新采样一次时,第一行将包含第一个月末之前的所有内容,第二行将包含第二个月到之后 3 个月之间的所有内容,依此类推。最后一行将包含从 2016-10-31
到此后 3 个月(即 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 )
关于python - 使用 DatetimeIndex 重新采样 DataFrame 并保留日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51857010/