处理CSV日期时间差值时遇Type error: cannot subtract DateTimeArray from ndarray错误求助
问题解决:Type error: cannot subtract DateTimeArray from ndarray
错误根源
你代码里的核心问题是pd.to_datetime(df["Date/Time Opened"]).dt.date这个操作——它返回的是Python原生date对象组成的numpy数组(ndarray),而非pandas的DatetimeArray。当你给这个ndarray加上pd.DateOffset(hours=17)后,类型逻辑混乱,后续和原DatetimeArray相减就触发了类型不匹配错误。
修正方案
直接在pandas的DatetimeArray上构造目标时间(当天17点),全程避免转成原生date对象:
分步写法(清晰易读)
# 先将原列转为datetime类型,避免重复调用pd.to_datetime df["dt_opened"] = pd.to_datetime(df["Date/Time Opened"]) # 构造当天17:00的datetime对象 df["target_time"] = df["dt_opened"].dt.floor("D") + pd.DateOffset(hours=17) # 计算时间差总秒数,补充np.where的判断逻辑(示例) df["open_time"] = np.where( # 这里替换成你的实际判断条件,比如时间差为正 (df["target_time"] - df["dt_opened"]).dt.total_seconds() > 0, (df["target_time"] - df["dt_opened"]).dt.total_seconds(), 0 # 示例默认值,按需调整 ) # 可选:删除临时辅助列 df.drop(["dt_opened", "target_time"], axis=1, inplace=True)
简化写法(无临时列)
如果不想新增临时列,可直接链式操作:
dt_opened = pd.to_datetime(df["Date/Time Opened"]) target_time = dt_opened.dt.floor("D") + pd.DateOffset(hours=17) df["open_time"] = np.where( # 替换为你的实际判断条件 (target_time - dt_opened).dt.total_seconds() > 0, (target_time - dt_opened).dt.total_seconds(), 0 )
关键注意点
- 始终用pandas的DatetimeArray(即
pd.to_datetime返回的Series)进行时间运算,不要转成原生date对象 dt.floor("D")会把datetime截断到当天0点,再加17小时即可得到当天17点的标准时间
内容的提问来源于stack exchange,提问作者Sunil M
相关产品推荐
相关产品推荐

