我面临与过滤掉在特定时间间隔(即给定以下数据帧为7到9)内处于活动状态的事件有关的任何问题:
EventId StartTime EndTime
18 2013-04-11 16:33:11.735342100 2013-04-11 17:16:47.976164100
19 2013-04-10 16:33:46.575337300 2013-04-11 18:10:08.428443900
20 2013-04-10 17:17:04.033083300 2013-04-11 18:10:13.907757900
21 2013-04-11 00:10:24.293352100 2013-04-11 18:45:17.754240800
23 2013-04-11 01:11:20.278558900 2013-04-11 18:45:00.435247300
25 2013-04-15 09:42:22.549026700 2013-04-15 23:54:33.389964300
26 2013-04-16 07:42:24.588807700 2013-04-16 17:42:41.077751300
28 2013-04-19 16:51:22.699240800 2013-04-19 18:39:03.167468100
31 2013-04-19 18:30:56.891621300 2013-04-19 19:42:50.418640200
17 2013-04-20 16:07:07.327879000 2013-04-20 22:17:17.783053600
我想获取那些在上午7点至9点(包括8点)处于活动状态的事件,并在提取几个小时作为单独的列之后在查询后使用。
df['StartTime']=pd.to_datetime(df['StartTime'])
df['EndTime']=pd.to_datetime(df['EndTime'])
df['StartHr']=df['StartTime'].dt.hour
df['EndHr']=df['EndTime'].dt.hour
df[((df['StartHr']<=7)| (df['StartHr']==8)) & ((df['EndHr']==8)|(df['EndHr']>=9))]
它可以按预期工作,但是在给定数据集的情况下,它无法获得某些结果,例如事件ID 20
20 2018-05-10 17:17:04.033083300 2018-05-11 18:10:13.907757900
此事件在第二天的7-9时间间隔内处于活动状态,但我无法获取。 id 26
和21
同样适用于解决此问题的任何帮助。如何比较熊猫中的日期时间值。
答案 0 :(得分:0)
首先,您可以拥有更简单的条件,即:
df[((df['StartHr']<=8)) & ((df['EndHr']>=8))]
我想不出简单的方法,那就是比较结束时间和开始时间之间的差异,并将其与79200 s进行比较,这对应于事件从上午9点开始到上午7点结束之间的秒数。早晨之后,即您的病例的持续时间(22h)。
我的代码如下:
limit_delta = 79200
test_df['diff'] = (test_df['EndTime'] - test_df['StartTime']).map(lambda td : td.total_seconds())
test_df[(((test_df['StartHr']<=8) & (test_df['EndHr']>=8)) | (test_df['diff'] <= limit_delta))]
请告诉我是否可以解决您的问题。
答案 1 :(得分:0)
我去了。
df=pd.DataFrame({'EventId':[18,19,20,21], 'startTime':['2013-04-11 07:33:11.735342100','2013-04-10 16:33:46.575337300','2013-04-10 08:17:04.033083300','2013-04-11 00:10:24.293352100'],'EndTime':['2013-04-11 08:16:47.976164100','2013-04-11 18:10:08.428443900','2013-04-11 09:10:13.907757900','2013-04-11 18:45:17.754240800']})
强制日期为日期时间
df['startTime']=pd.to_datetime(df['startTime'])
df['EndTime']=pd.to_datetime(df['EndTime'])
df.set_index(['startTime'], inplace=True)
设置每个时间纪元,开始和结束以建立索引并使用.between_time
提取合适的时间df['StartHr']=df.index.time
a=df.iloc[:,:1].between_time('07:00:00', '09:00:00')
df.reset_index(inplace=True)
a.reset_index(inplace=True)
df.set_index(['EndTime'], inplace=True)
df['EndHr']=df.index.time
b=df.iloc[:,:-2].between_time('07:00:00', '09:00:00')
b.reset_index(inplace=True)
合并两个结果
df2=pd.merge(a, b, on='EventId')