我有一个带有日期时间索引的DataFrame:
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点。
我可以在以下时间范围内执行此操作:
import datetime
selection = tbl.ix[datetime.time(6):datetime.time(19)]
添加工作日条件,即结合时间范围和布尔索引显然不会像我尝试的那样工作:
tbl['weekday'] = tbl.index.weekday
test = tbl[(tbl.ix[datetime.time(6):datetime.time(19)]) & (tbl['weekday'] == 4)]
=> TypeError:无法比较类型'时间戳'使用类型' str'
test = tbl[(tbl.index>datetime.time(6)) (tbl.index>datetime.time(19)) & (tbl['weekday'] == 4)]
=> TypeError:类型对象08:00:00
tbl['date'] = tbl.index
test = tbl[(tbl['date']>datetime.time(8)) & (tbl['weekday'] == 4)]
=> ValueError:无法从参数
构造时间戳我的代码出了什么问题?
答案 0 :(得分:0)
第一位过滤数据帧,第二位返回布尔值: 尝试
test = (tbl[(tbl.ix[datetime.time(6):datetime.time(19)]).ix[tbl.weekday == 4)]
基本上应用第一个过滤器,然后是第二个过滤器。等效的布尔值和。
我建议您使用像Ipython或其笔记本之类的东西来检查函数的中间结果,以确保它们仍然符合预期。如果您对pandas语法没有经验,那么很难直接写出这些表达式。
答案 1 :(得分:0)
我现在找到了一个解决方案:
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]
有更优雅的东西吗?