使用pandas eval计算时间差报错:unknown type timedelta64[ns]
解决pandas eval计算datetime列差值时的ValueError问题
问题重现
尝试用pandas.eval()计算两个datetime列的时间差并转成分钟,代码如下:
delay = ( dataset .query("INCIDENT_TYPE_DESC == '111 - Building fire'") .eval("ARRIVAL_DATE_TIME - INCIDENT_DATE_TIME") .divide(pd.Timedelta("1m")) )
执行后报错:
ValueError: unknown type timedelta64[ns]
数据集相关信息:两个目标列INCIDENT_DATE_TIME和ARRIVAL_DATE_TIME均为datetime64[ns]类型。
解决方案
方案1:直接使用列运算(推荐)
避开eval(),直接对筛选后的子集做列减法:
# 先筛选目标数据 subset = dataset.query("INCIDENT_TYPE_DESC == '111 - Building fire'") # 计算时间差并转成分钟 delay = (subset.ARRIVAL_DATE_TIME - subset.INCIDENT_DATE_TIME) / pd.Timedelta("1m")
或者用链式写法:
delay = ( dataset .query("INCIDENT_TYPE_DESC == '111 - Building fire'") .pipe(lambda df: df.ARRIVAL_DATE_TIME - df.INCIDENT_DATE_TIME) .divide(pd.Timedelta("1m")) )
方案2:在eval中转换为数值运算
如果一定要使用eval(),可以将时间差转为总秒数后再计算分钟数:
delay = ( dataset .query("INCIDENT_TYPE_DESC == '111 - Building fire'") .eval("(ARRIVAL_DATE_TIME - INCIDENT_DATE_TIME).total_seconds() / 60") )
原因说明
pandas的eval()方法在处理datetime64[ns]列相减返回的timedelta64[ns]类型时存在兼容性限制,无法直接识别该类型进行后续运算。直接列运算或在eval中转为数值(秒数)可以绕过这个问题。
内容的提问来源于stack exchange,提问作者user31081998
相关产品推荐
相关产品推荐

