Pandas按月重新采样第15天

4

我想对数据进行重新采样,使其以每月的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,但没有结果。


输入样本数据是什么? - jezrael
你需要聚合数据还是仅筛选出“15天”这样的数据,例如 df = df[df['date'].dt.day == 15] - jezrael
每日数据,例如。我正在尝试聚合数据。 - gis20
3个回答

8

按月初聚合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

1

在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')

0
对于Python 3.11和Pandas 2.0.2,以下方法可用于在中旬时间进行重新采样。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接