如何对pandas中由两日期差值生成的duration列进行数值筛选
问题解决方法
报错原因
duration列是
timedelta64时间差类型,直接和整数对比时,pandas无法判断整数对应的时间单位(天/小时/秒等),因此触发类型匹配错误。
解决方案
以下三种方案性能差异极小,可根据使用场景选择:
- 方案1:查询时将时间差转为对应单位的整数(无需修改原表,最灵活)
如果按天为单位筛选,直接调用timedelta的dt属性取天数即可:
需要其他单位时修改对应属性即可,比如按总秒数比较就换成df.query('duration.dt.days < 5')duration.dt.total_seconds() < 5。 - 方案2:将整数转为对应时间差类型再比较
需要用@符号在query语句中引用外部的pandas时间差对象:import pandas as pd # 示例为判断是否小于5天,可修改Timedelta参数调整单位,比如hours=5代表5小时 df.query('duration < @pd.Timedelta(days=5)') - 方案3:生成duration列时直接转成对应单位的整数(适合频繁使用duration做数值计算的场景)
生成列时就做转换,后续所有操作都可以直接按整数处理:df['duration'] = (df['date2'] - df['date1']).dt.days # 后续筛选无需额外处理 df.query('duration < 5')
疑问解答
你提到的「将数值5转换为对应的时间类型对象」是可行的解决思路,也就是上面的方案2,和转时间差为整数的思路没有绝对优劣,按需选择即可。
内容的提问来源于stack exchange,提问作者SUICIDALTENDENCIES1
相关产品推荐
相关产品推荐

