假设我有这样一个数据框:
d = {'price': [10, 12, 8, 12, 14, 18, 10, 20],
'volume': [50, 60, 40, 100, 50, 100, 40, 50]}
df = pd.DataFrame(d)
df['a_date'] = pd.date_range('01/01/2018',
periods=8,
freq='W')
df
price volume a_date
0 10 50 2018-01-07
1 12 60 2018-01-14
2 8 40 2018-01-21
3 12 100 2018-01-28
4 14 50 2018-02-04
5 18 100 2018-02-11
6 10 40 2018-02-18
7 20 50 2018-02-25
现在,我希望以约10天为一个时间间隔重新采样/分组数据,但要使用预定义的开始和结束日期,这些日期是每个月的第10天、第20天和最后一天,例如:
2018-01-01 to 2018-01-10
2018-01-11 to 2018-01-20
2018-01-21 to 2018-01-31
2018-02-01 to 2018-02-10
2018-02-11 to 2018-02-20
2018-02-21 to 2018-02-28
如果跨越这些时间间隔进行求和,结果将是:
price volume
a_date
2018-01-10 10 50
2018-01-20 12 60
2018-01-31 20 140
2018-02-10 14 50
2018-02-20 28 140
2018-02-28 20 50
我能提供的最接近这个需求的方法是使用
df.resample('10D', on='a_date').sum()
,但很明显我需要更加定制化的间隔方式。如果能够传入一个间隔数组我会很高兴,但我认为这是不可能的。作为实验,我尝试过:
td = pd.to_datetime('2018-01-10') - pd.to_datetime('2018-01-01')
df.resample(td, on='a_date').sum()
但是 pandas.Timedelta
并不保留特定日期的信息。
编辑:
一个不同的数据框用于测试每个月的第一天:
d = {'price': np.arange(20)+1,
'volume': np.arange(20)+5}
df = pd.DataFrame(d)
df['a_date'] = pd.date_range('01/01/2018',
periods=20,
freq='D')
应用被接受的答案后,结果为(第一天不计算在内):
a_date price volume
0 2018-01-10 54 90
1 2018-01-20 155 195
与之比较(第一个时间段2018-01-01至2018-01-10):
df.iloc[:10].sum()
price 55
volume 95
dtype: int64
pandas.IntervalIndex
作为区间是正确的方法。 - duff18