日期范围的交叉点,对具有交叉日期范围的所有元素进行计算

时间:2014-01-17 17:25:50

标签: datetime pandas grouping intersection

下表代表较大的表格,按代码(第一栏)排序。对于每个id(4884,比方说),我想用相同的代码识别其他ID并且LOG_TIME下降  在[开始,结束]范围内(id = 4884,比方说)。然后,在所有这些条目中,我想计算最高价格。重复此过程 所有条目并输入结果作为最高价格新列。

换句话说:

对于数据中的每一行,计算所有其他条目的最高价格 在具有相同代码和重叠[开始,结束]范围的表中。

Code    finish         start          LOG_TIME       ID     Price
2   01/03/13 17:53  20/02/13 11:54  20/02/13 11:54  4884    80.5
2   01/03/13 17:53  20/02/13 11:54  26/02/13 10:06  4884    80.5
2   01/03/13 17:53  20/02/13 11:54  01/03/13 10:53  4884    85.1
2   01/03/13 17:53  20/02/13 11:54  01/03/13 17:53  4884    85.1
2   15/04/13 12:26  05/03/13 12:36  05/03/13 12:36  4961    86.25
2   15/04/13 12:26  05/03/13 12:36  08/03/13 11:11  4961    90.85
2   15/04/13 12:26  05/03/13 12:36  11/03/13 10:40  4961    92
2   15/04/13 12:26  05/03/13 12:36  15/04/13 12:26  4961    92
2   15/04/13 12:26  05/03/13 12:36  09/06/13 17:00  4961    92
2   26/06/13 10:55  26/06/13 10:55  26/06/13 10:55  5410    80.5
2   26/06/13 10:55  26/06/13 10:55  26/06/13 10:55  5410    80.5
3   01/01/14 22:50  18/12/13 15:46  18/12/13 15:46  6102    80.5
3   01/12/20 00:00  23/12/13 10:21  23/12/13 10:21  6114    81.65
3   01/01/14 22:50  18/12/13 15:46  01/01/14 22:50  6102    83.95
3   01/01/14 22:50  18/12/13 15:46  01/01/14 22:50  6102    83.95
….. ….  ….  ….  ….  ….

有没有办法在大型数据集上有效地执行此操作?我看不到用虚拟变量做这种方法的方法。也许唯一的方法是对每个条目的代码中的所有条目执行FOR循环,检查LOG_TIME是否在该范围内,然后计算最大价格。

我想知道是否有人能够看到这样做的聪明方法。任何帮助非常感谢!

1 个答案:

答案 0 :(得分:0)

如果你正在使用pandas并假设日期是日期时间格式,你可以按'代码'进行分组,然后对其应用最小,最大函数。

假设df是你的数据帧,你会有类似的东西。

df.groupby('Code').apply(lambda x: min(x.LOG_TIME),max(x.LOG_TIME))

如果LOG_TIME不是日期时间格式,只需将其转换为:

import pandas as pd
df['LOG_TIME'] = pd.to_datetime(df.LOG_TIME)