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_..
相关产品推荐
相关产品推荐

