Python 熊猫计算日期之间的值之和(来自另一个df)

Python 熊猫计算日期之间的值之和(来自另一个df),python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,第一次在这里发布。 我想通过MachineID(我认为groupby应该用于此?)在另一个df中找到datetime范围的列中查找值的累积和。最小代码: import numpy as np import pandas as pd import datetime as dt #Define first dataframe d1 = {'DateTime': [dt.datetime(2019, 10, 1), dt.datetime(2019, 11, 15),dt.datetime(2019

第一次在这里发布。 我想通过MachineID(我认为groupby应该用于此?)在另一个df中找到datetime范围的列中查找值的累积和。最小代码:

import numpy as np
import pandas as pd
import datetime as dt

#Define first dataframe
d1 = {'DateTime': [dt.datetime(2019, 10, 1), dt.datetime(2019, 11, 15),dt.datetime(2019, 12, 1),dt.datetime(2020, 1, 1)], 'MachineID': [1, 1, 3, 1]}
df1 = pd.DataFrame(data=d1)

#Define second dataframe
d2 = {'DateTime': [dt.datetime(2019, 10, 5), dt.datetime(2019, 11, 5),dt.datetime(2019, 12, 5),dt.datetime(2020, 1, 5)], 'MachineID': [1, 1, 3, 1], 'ExperimentalValue':[5.5, 7.1, 3.9, 113]}
df2 = pd.DataFrame(data=d2)
示例数据帧如下所示:

df1
Out[65]: 
    DateTime  MachineID
0 2019-10-01          1
1 2019-11-15          1
2 2019-12-01          3
3 2020-01-01          1

df2
Out[69]: 
    DateTime  MachineID  ExperimentalValue
0 2019-10-05          1                5.5
1 2019-11-05          1                7.1
2 2019-12-05          3                3.9
3 2020-01-05          1              113.0
对于每台机器ID,我想找到在df1中找到的特定机器的日期时间之间的日期的“实验值”列中的值的累积和。例如,对于MachineID=1,在df1中找到的第一个日期时间范围为[2019-10-01;2019-11-15],使用此日期范围查找df2中MachineID 1的实验值的累积和应得出:

    DateTime  MachineID  ExperimentalValue  CumSum
0 2019-10-05          1                5.5  5.5
1 2019-11-05          1                7.1  12.6
2 2019-12-05          3                3.9  3.9
3 2020-01-05          1              113.0  113.0
请注意,只有前两行被求和(在第2行中),因为它们是唯一具有相同MachineID且在df1的相同日期时间范围内的行


我不知道如何实现这一目标。提前感谢。

IIUC,每次MachineID更改时,累积值都会重新启动,因此我们无法按MachineID分组。我创建了一个名为block_id的新列来跟踪此更改。我从df2的原始定义开始:

# MachineID on current row vs previous row
df2['block_id'] = df2['MachineID'] != df2['MachineID'].shift(1)

# cumulative sum of boolean increases each time the MachineID changes
df2['block_id'] = df2['block_id'].cumsum()

df2['CumSum'] = df2.groupby('block_id')['ExperimentalValue'].cumsum()

print(df2)

    DateTime  MachineID  ExperimentalValue  block_id  CumSum
0 2019-10-05          1                5.5         1     5.5
1 2019-11-05          1                7.1         1    12.6
2 2019-12-05          3                3.9         2     3.9
3 2020-01-05          1              113.0         3   113.0

您可能想删除block_id列,但我保留了它以显示逻辑。

IIUC,每次MachineID更改时,累积值都会重新启动,因此我们无法按MachineID分组。我创建了一个名为block_id的新列来跟踪此更改。我从df2的原始定义开始:

# MachineID on current row vs previous row
df2['block_id'] = df2['MachineID'] != df2['MachineID'].shift(1)

# cumulative sum of boolean increases each time the MachineID changes
df2['block_id'] = df2['block_id'].cumsum()

df2['CumSum'] = df2.groupby('block_id')['ExperimentalValue'].cumsum()

print(df2)

    DateTime  MachineID  ExperimentalValue  block_id  CumSum
0 2019-10-05          1                5.5         1     5.5
1 2019-11-05          1                7.1         1    12.6
2 2019-12-05          3                3.9         2     3.9
3 2020-01-05          1              113.0         3   113.0

您可能想删除block_id列,但我保留了它以显示逻辑。

这里是关于使用第一个数据帧的附加信息

  • 我假设每一行表示机器在给定日期启动(或停止)
  • 目标是在同一行上获得开始时间和停止时间
  • 如果没有停止时间,则机器仍在运行

现在您可以组合df1和df2。例如,对于df2中的给定行:我们是否处于第一个启动/停止周期,第二个周期,…

这里是关于使用第一个数据帧的附加信息

  • 我假设每一行表示机器在给定日期启动(或停止)
  • 目标是在同一行上获得开始时间和停止时间
  • 如果没有停止时间,则机器仍在运行

现在您可以组合df1和df2。例如,对于df2中的给定行:我们是否处于第一个启动/停止周期,第二个周期,…

谢谢您的回答。这是个好把戏。但是,我仍然不确定如何获得df1中给出的每台机器ID的日期之间的总和?谢谢您的回答。这是个好把戏。但是,我仍然不确定如何获得df1中给出的每个机器ID的日期之间的总和?