我想对数据进行重新采样,使其以每月的15日为基准。
我查看了时间序列的偏移量文档,但只提供了:
M 月末频率 SM 半月末频率(15日和月底) MS 月初频率 SMS 半月初频率(1日和15日)
而我需要的是仅在15日这一天进行采样。
类似于:
2000-01-15 8.7
2000-02-15 6.9
2000-03-15 15.8
2000-04-15 12.4
我尝试使用pd.offsets.MonthBegin和MonthOffset,但没有结果。
我想对数据进行重新采样,使其以每月的15日为基准。
我查看了时间序列的偏移量文档,但只提供了:
M 月末频率 SM 半月末频率(15日和月底) MS 月初频率 SMS 半月初频率(1日和15日)
而我需要的是仅在15日这一天进行采样。
类似于:
2000-01-15 8.7
2000-02-15 6.9
2000-03-15 15.8
2000-04-15 12.4
我尝试使用pd.offsets.MonthBegin和MonthOffset,但没有结果。
按月初聚合MS
,然后通过loffset
参数调整重新采样的时间标签:
df1 = df.resample('MS', loffset=pd.Timedelta(14, 'd')).sum()
样例:
rng = pd.date_range('2017-04-03', periods=15, freq='5D')
df = pd.DataFrame({'a': range(15)}, index=rng)
print (df)
a
2017-04-03 0
2017-04-08 1
2017-04-13 2
2017-04-18 3
2017-04-23 4
2017-04-28 5
2017-05-03 6
2017-05-08 7
2017-05-13 8
2017-05-18 9
2017-05-23 10
2017-05-28 11
2017-06-02 12
2017-06-07 13
2017-06-12 14
df1 = df.resample('MS', loffset=pd.Timedelta(14, 'd')).sum()
print (df1)
a
2017-04-15 15
2017-05-15 51
2017-06-15 39
df1 = df.resample('SMS').sum()
print (df1)
a
2017-04-01 3
2017-04-15 12
2017-05-01 21
2017-05-15 30
2017-06-01 39
在pandas 1.4.2
版本中,另一个答案已经被弃用,并伴随着警告信息FutureWarning: 'loffset' in .resample() and in Grouper() is deprecated.
推荐的替代方案是首先按照正常方式进行重采样,然后向索引添加一个Timedelta
:
df1 = df.resample('MS').sum()
df1.index += pd.Timedelta(14, 'd')
from datetime import datetime
times = ['2022-06-15 00:12:23', '2022-06-18', '2022-07-03', '2022-07-18']
data = [10, 100, 1000, 10000]
df = pd.DataFrame(data, index=pd.to_datetime(times), columns=['test'])
period = '1M'
start = pd.Timestamp(year=2022, month=5, day=15)
offset = pd.Timedelta(days=start.day - 1, hours=start.hour, minutes=start.minute, seconds=start.second, microseconds=start.microsecond)
df.index = df.index - offset
rs = df.resample(period).sum()
rs.index = rs.index + offset + pd.Timedelta(days=1)
rs
给我:
test
2022-07-15 1110
2022-08-15 10000
df = df[df['date'].dt.day == 15]
? - jezrael