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

Python中pd.to_datetime日期比较失效问题排查求助

解决日期比较失效的问题

首先,你的代码里有两个关键错误导致只有else分支生效:

1. 日期参数的写法错误

你写的pd.to_datetime(2034-11-15)里,2034-11-15是数值运算,不是日期字符串。Python会先计算这个表达式:2034-11=2023,再减15得到2008。pd.to_datetime(2008)会把这个数字当成“从1970-01-01开始的天数”,最终解析出的日期是1975-07-16左右——你的time列都是2023年的日期,肯定都比这个日期大,所以所有行都返回0。

另外你还写错了年份:需求里是2023-11-15,代码里写成了2034,这也是一个影响结果的笔误。

2. 日期解析的歧义(可选但推荐)

你的截止日期格式是11-15-2023(月-日-年),虽然pandas通常能自动解析,但为了避免地区格式带来的歧义(比如部分地区习惯日-月-年),最好显式指定格式。


修正后的代码方案

方案1:用ISO格式字符串(最稳妥)

直接传递'2023-11-15'这种年-月-日的ISO格式字符串,pandas能完美解析:

import pandas as pd
import numpy as np

# 定义正确的截止日期
cutoff_date = pd.to_datetime('2023-11-15')
# 为churned列赋值
out1['churned'] = np.where(out1['time'] <= cutoff_date, 1, 0)

方案2:显式指定月-日-年的格式

如果要严格按照11-15-2023的格式解析,用format参数明确规则:

cutoff_date = pd.to_datetime('11-15-2023', format='%m-%d-%Y')
out1['churned'] = np.where(out1['time'] <= cutoff_date, 1, 0)

补充:如果需要包含当天的所有时间(时分秒)

如果你的time列包含时分秒(比如2023-11-15 14:30:00),默认的2023-11-15会被解析为2023-11-15 00:00:00,这样当天晚些时候的时间会被判定为大于截止日期。如果要包含当天所有时间,可以这样写:

# 方法1:直接指定到当天最后一秒
cutoff_date = pd.to_datetime('2023-11-15 23:59:59')
# 方法2:用Timedelta计算
cutoff_date = pd.to_datetime('2023-11-15') + pd.Timedelta(days=1, seconds=-1)

验证步骤

为了确保问题解决,你可以先单独验证截止日期是否正确解析:

print(cutoff_date)
# 应该输出:Timestamp('2023-11-15 00:00:00') 或者你指定的时间

再检查time列的日期范围,确认确实有数据在截止日期之前:

print(out1['time'].min(), out1['time'].max())

这样就能确认churned列会正确赋值1给符合条件的行了。

内容的提问来源于stack exchange,提问作者mickey_..

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:39:09