Python 熊猫计算日期之间的值之和(来自另一个df)
第一次在这里发布。 我想通过MachineID(我认为groupby应该用于此?)在另一个df中找到datetime范围的列中查找值的累积和。最小代码: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
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的日期之间的总和?