假设我有两个数据框 df1
和 df2
在df1
中
date value
0 2018-01-23 10:00:00 10
1 2018-01-23 10:05:00 20
2 2018-01-23 10:10:00 30
3 2018-01-23 10:15:00 40
4 2018-01-23 10:20:00 50
在df2
date value
0 2018-01-23 10:02:00 10
1 2018-01-23 10:03:00 20
2 2018-01-23 10:04:00 30
3 2018-01-23 10:05:00 40
4 2018-01-23 10:16:00 50
5 2018-01-23 10:17:00 60
首先,我根据df1.date
获得IntervalIndex(左闭,右开),对于每个间隔,我需要计算df2.value
的总和并映射求和到df1
。
编辑: 我使用的代码:
shift_date = df1.date.shift(-1)
shift_date[-1] = df1.date.iloc[-2] + timedelta(minutes=5) #avoid NaT
idx = pd.IntervalIndex.from_arrays(df1.date, shift_date, closed = "left")
df2_sum = df2.loc[idx.get_indexer(df1.date), 'value']
df2_sum = df2_sum.groupby(df2_sum.index).sum()
但仅将df1
的值映射到df2.index
。
我正在寻找的东西看起来像
date value df2_value
0 2018-01-23 10:00:00 10 60
1 2018-01-23 10:05:00 20 40
2 2018-01-23 10:10:00 30 0
3 2018-01-23 10:15:00 40 0
4 2018-01-23 10:20:00 50 110
最佳答案
首先创建 IntervalIndex
并在未来某个日期(例如 2100-01-01
)之前删除 NaT
fillna:
df1.index = pd.IntervalIndex.from_arrays(df1.date,
df1.date.shift(-1).fillna(pd.datetime(2100,1,1)),
closed = "left")
print (df1)
date value
[2018-01-23 10:00:00, 2018-01-23 10:05:00) 2018-01-23 10:00:00 10
[2018-01-23 10:05:00, 2018-01-23 10:10:00) 2018-01-23 10:05:00 20
[2018-01-23 10:10:00, 2018-01-23 10:15:00) 2018-01-23 10:10:00 30
[2018-01-23 10:15:00, 2018-01-23 10:20:00) 2018-01-23 10:15:00 40
[2018-01-23 10:20:00, 2100-01-01) 2018-01-23 10:20:00 50
然后使用 cut
使用 groupby 和聚合sum
:
df3 = df2.groupby(pd.cut(df2.date, bins=df1.index))['value'].sum().rename('df2_value')
print (df3)
date
[2018-01-23 10:00:00, 2018-01-23 10:05:00) 60
[2018-01-23 10:05:00, 2018-01-23 10:10:00) 40
[2018-01-23 10:10:00, 2018-01-23 10:15:00) 0
[2018-01-23 10:15:00, 2018-01-23 10:20:00) 110
[2018-01-23 10:20:00, 2100-01-01) 0
Name: df2_value, dtype: int64
两个索引相同,因此可以删除它并concat
:
df = pd.concat([df1.reset_index(drop=True), df3.reset_index(drop=True)], axis=1)
print (df)
date value df2_value
0 2018-01-23 10:00:00 10 60
1 2018-01-23 10:05:00 20 40
2 2018-01-23 10:10:00 30 0
3 2018-01-23 10:15:00 40 110
4 2018-01-23 10:20:00 50 0
关于python - 如何根据 IntervalIndex 对跳过的日期时间的值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48416481/