我正在继续提高我的熊猫技能,并遇到了一些难题。此问题涉及两个数据帧df1和df2。df1包含事件时间和每个事件的相应详细信息。df2包含由开始时间和停止时间确定的时间段。
目标:
码:
import pandas as pd
df1 = {'Event': ['2020-12-01 00:10:22', '2020-12-01 00:15:11','2020-12-01 00:18:00',
'2020-12-01 00:31:00', '2020-12-01 00:54:00' , '2020-12-01 01:01:00' ,
'2020-12-01 01:19:00' , '2020-12-01 01:23:00' , '2020-12-01 01:24:00' ,
'2020-12-01 01:56:00' , '2020-12-01 21:02:00', '2020-12-01 02:41:00',
'2020-12-01 02:44:00' , '2020-12-01 03:19:00' ,'2020-12-01 03:22:00' ,
'2020-12-01 03:49:00' , '2020-12-01 05:24:00' ,'2020-12-01 05:56:00' ,
'2020-12-01 08:02:00'
] ,
'Count' : [1 , 2 , 4 , 2 , 5 ,
3 , 7 , 9 , 10 , 1 ,
2 , 5 , 6 , 10 , 5 ,
6 ,7 , 8 , 3] ,
'Code' : ['A' , 'A' , 'A' , 'A' , 'B' ,
'B' , 'B' , 'B' , 'B' , 'B' ,
'C' , 'C' , 'C' , 'C' , 'C' ,
'D' , 'D' , 'D' , 'D']
}
df1 = pd.DataFrame(df1 , columns = ['Event' , 'Count' , 'Code'])
df1['Event'] = pd.to_datetime(df1['Event'])
df
Event Count Code
0 2020-12-01 00:10:22 1 A
1 2020-12-01 00:15:11 2 A
2 2020-12-01 00:18:00 4 A
3 2020-12-01 00:31:00 2 A
4 2020-12-01 00:54:00 5 B
5 2020-12-01 01:01:00 3 B
6 2020-12-01 01:19:00 7 B
7 2020-12-01 01:23:00 9 B
8 2020-12-01 01:24:00 10 B
9 2020-12-01 01:56:00 1 B
10 2020-12-01 21:02:00 2 C
11 2020-12-01 02:41:00 5 C
12 2020-12-01 02:44:00 6 C
13 2020-12-01 03:19:00 10 C
14 2020-12-01 03:22:00 5 C
15 2020-12-01 03:49:00 6 D
16 2020-12-01 05:24:00 7 D
17 2020-12-01 05:56:00 8 D
18 2020-12-01 08:02:00 3 D
创建df2代码:
df2 = {'Start Time' : ['2020-12-01 00:00:00', '2020-12-01 00:30:00','2020-12-01 01:30:00',
'2020-12-01 02:30:00', '2020-12-01 03:30:00' , '2020-12-01 04:30:00' ,
'2020-12-01 05:30:00' , '2020-12-01 07:30:00' , '2020-12-01 10:30:00' ,
'2020-12-01 15:00:00' , '2020-12-02 21:00:00'] ,
'End Time' : ['2020-12-01 00:30:00', '2020-12-01 01:30:00','2020-12-01 02:30:00',
'2020-12-01 03:30:00', '2020-12-01 04:30:00' , '2020-12-01 05:30:00' ,
'2020-12-01 07:30:00' , '2020-12-01 10:30:00' , '2020-12-01 15:00:00' ,
'2020-12-01 21:00:00' , '2020-12-02 00:00:00']
}
df2 = pd.DataFrame(df2 , columns = ['Start Time' , 'End Time'])
df2['Start Time'] = pd.to_datetime(df2['Start Time'])
df2['End Time'] = pd.to_datetime(df2['End Time'])
df2
Start Time End Time
0 2020-12-01 00:00:00 2020-12-01 00:30:00
1 2020-12-01 00:30:00 2020-12-01 01:30:00
2 2020-12-01 01:30:00 2020-12-01 02:30:00
3 2020-12-01 02:30:00 2020-12-01 03:30:00
4 2020-12-01 03:30:00 2020-12-01 04:30:00
5 2020-12-01 04:30:00 2020-12-01 05:30:00
6 2020-12-01 05:30:00 2020-12-01 07:30:00
7 2020-12-01 07:30:00 2020-12-01 10:30:00
8 2020-12-01 10:30:00 2020-12-01 15:00:00
9 2020-12-01 15:00:00 2020-12-01 21:00:00
10 2020-12-01 21:00:00 2020-12-02 00:00:00
战略:
我的策略是使用pd.Dataframe.between_time,然后使用lambda函数进行条件语句检查,但我似乎无法使其工作。
以下是所需的输出:
Start Time End Time Test
0 2020-12-01 00:00:00 2020-12-01 00:30:00 True
1 2020-12-01 00:30:00 2020-12-01 01:30:00 False
2 2020-12-01 01:30:00 2020-12-01 02:30:00 True
3 2020-12-01 02:30:00 2020-12-01 03:30:00 False
4 2020-12-01 03:30:00 2020-12-01 04:30:00 True
5 2020-12-01 04:30:00 2020-12-01 05:30:00 True
6 2020-12-01 05:30:00 2020-12-01 07:30:00 True
7 2020-12-01 07:30:00 2020-12-01 10:30:00 True
8 2020-12-01 10:30:00 2020-12-01 15:00:00 False
9 2020-12-01 15:00:00 2020-12-01 21:00:00 False
10 2020-12-02 21:00:00 2020-12-02 00:00:00 False
您可以使用根据指定条件产生布尔值的自定义函数。在这里,我们用于Series.is_monotonic_increasing
检查是否Count
递增,并且Series.nunique
在给定时间段内检查所有代码是否相同:
def f():
for x, y in df2.to_numpy():
s = df1[df1['Event'].between(x, y)]
yield s['Count'].is_monotonic_increasing & s['Code'].nunique() == 1
df2['Test'] = list(f())
结果:
Start Time End Time Test
0 2020-12-01 00:00:00 2020-12-01 00:30:00 True
1 2020-12-01 00:30:00 2020-12-01 01:30:00 False
2 2020-12-01 01:30:00 2020-12-01 02:30:00 True
3 2020-12-01 02:30:00 2020-12-01 03:30:00 False
4 2020-12-01 03:30:00 2020-12-01 04:30:00 True
5 2020-12-01 04:30:00 2020-12-01 05:30:00 True
6 2020-12-01 05:30:00 2020-12-01 07:30:00 True
7 2020-12-01 07:30:00 2020-12-01 10:30:00 True
8 2020-12-01 10:30:00 2020-12-01 15:00:00 False
9 2020-12-01 15:00:00 2020-12-01 21:00:00 False
10 2020-12-02 21:00:00 2020-12-02 00:00:00 False
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句