python - 如何根据 IntervalIndex 对跳过的日期时间的值求和?

标签 python pandas datetime dataframe

假设我有两个数据框 df1df2

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/

相关文章:

Python/Pygame字符快速闪烁

python - 在 Pyomo/AMPL 中定义多个模型

python - Sqlalchemy - 如何在 Oracle 数据库中指定所有者

python - 有没有办法使用 python 附加具有相同列名的列的值?

java - Java 中最接近嵌套字典(python)的东西是什么?

python - 如何将具有打包列和行名称的数据帧连接到未打包的数据帧

python - 仅包含时间部分的 DatetimeIndex : is it possible

Python 使用 if 函数 : ValueError:Truth value of a Series is ambiguous. 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

python - 为什么日期时间字符串格式不可逆?

java - 将 DateString 解析为 Date 或 DateTime