如何结合时间范围和布尔索引?

2024-05-18 23:28:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有日期时间索引的数据帧:

tbl.iloc[:,:2].head(5)

date_time               var1    var2    
2011-01-01 00:05:00     97.97   1009.28
2011-01-01 00:10:00     97.53   1009.53
2011-01-01 00:15:00     97.38   1009.15
2011-01-01 00:20:00     97.23   1009.03
2011-01-01 00:25:00     97.01   1009.03

现在我想选择星期一到星期五早上6点到晚上7点,星期六从早上6点到下午5点,星期天早上8点到下午5点。在

我可以在一个时间范围内使用:

^{pr2}$

添加工作日条件,即将时间范围和布尔索引结合起来,显然无法按我尝试的方式工作:

tbl['weekday'] = tbl.index.weekday
test = tbl[(tbl.ix[datetime.time(6):datetime.time(19)]) & (tbl['weekday'] == 4)]

=>;类型错误:无法将类型“Timestamp”与类型“str”进行比较

test = tbl[(tbl.index>datetime.time(6)) (tbl.index>datetime.time(19)) & (tbl['weekday'] == 4)]

=>;类型错误:键入对象08:00:00

tbl['date'] = tbl.index
test = tbl[(tbl['date']>datetime.time(8)) & (tbl['weekday'] == 4)]

=>;ValueError:无法从参数构造时间戳

我的代码怎么了?在


Tags: 数据testgt类型datetimedateindextime
2条回答

第一位过滤数据帧,第二位返回布尔值: 试试看

test = (tbl[(tbl.ix[datetime.time(6):datetime.time(19)]).ix[tbl.weekday == 4)]

基本上应用第一个过滤器,然后第二个过滤器在上面。相当于布尔and。在

我建议您使用Ipython或它的笔记本来检查函数的中间结果,以确保它们仍然如预期的那样。如果你还没有使用pandas语法的经验,就很难把这些表达式直接写出来。在

我现在找到了解决办法:

criterion1 = tbl.index.map(lambda i: i.hour >= 8)
criterion2 = tbl.index.map(lambda i: i.hour < 19)
criterion3 = (tbl['weekday'] == 4) 

tbl[criterion1 & criterion2 & criterion3]

有更优雅的吗?在

相关问题 更多 >

    热门问题