You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:35:23