首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pandas:基于多列过滤日期时间值的问题

pandas:基于多列过滤日期时间值的问题
EN

Stack Overflow用户
提问于 2020-03-30 18:31:43
回答 2查看 133关注 0票数 1

我面临着任何与过滤掉在特定时间间隔内活动的事件相关的问题,例如,给定以下数据帧7到9:

代码语言:javascript
复制
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个,并在提取小时作为单独的列后用于以下查询。

代码语言:javascript
复制
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

代码语言:javascript
复制
            20   2018-05-10 17:17:04.033083300   2018-05-11 18:10:13.907757900  

因为这个活动在第二天的时间间隔7-9是活跃的,但是我无法得到它。对于解决此问题的任何帮助,id 2621也是如此。如何比较pandas中的日期-时间值。

EN

回答 2

Stack Overflow用户

发布于 2020-03-30 20:40:06

首先,你可以有更简单的条件,即:

代码语言:javascript
复制
df[((df['StartHr']<=8)) & ((df['EndHr']>=8))]

我想不出比取结束时间和开始时间之间的差值并将其与79200秒进行比较更简单的方法了,这相当于从上午9点开始的事件到第二天早上7点结束的事件之间的秒数,即您的情况下的限制持续时间(22小时)。

我的代码如下所示:

代码语言:javascript
复制
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))] 

如果这解决了你的问题,请告诉我。

票数 0
EN

Stack Overflow用户

发布于 2020-03-30 23:16:11

我试过了。

代码语言:javascript
复制
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']})

将日期强制转换为日期时间

代码语言:javascript
复制
df['startTime']=pd.to_datetime(df['startTime'])
df['EndTime']=pd.to_datetime(df['EndTime'])
df.set_index(['startTime'], inplace=True)

使用.between_time设置每个时间纪元、开始和结束到索引并提取合适的时间

代码语言:javascript
复制
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)

合并两个结果

代码语言:javascript
复制
df2=pd.merge(a, b, on='EventId')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60928607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档