Pandas日期字符串与datetime列比较异常,求解决方案确认
问题分析与解决方案
你遇到的问题根源在于字符串的字典序比较逻辑和实际日期的时间顺序不匹配。
你把ramped_date转成了月/日/年(比如10/31/2018)的字符串格式,而字符串比较是逐字符按ASCII码顺序判断的:拿10/31/2018和12/1/2000对比,前两位10 vs 12,10的第二个字符0比12的2ASCII值小,所以字符串层面会判定10/31/2018 < 12/1/2000,但实际2018年的日期远晚于2000年,这就导致了筛选结果完全错误。
可行解决方案
方案1:保留datetime类型(推荐)
不要把datetime列转成字符串,直接用datetime对象和字符串日期(Pandas会自动解析)比较,也可以手动把dat转成datetime:
# 保留ramped_date为datetime类型,跳过strftime转字符串的步骤 ae_long['ramped_date'] = pd.to_datetime(ae_long['ramped_date'], errors='coerce') dat = '12/1/2000' # Pandas会自动将dat解析为datetime类型,直接比较即可 assert len(ae_long.loc[ae_long['ramped_date'] > dat]) == 0
方案2:使用匹配时间顺序的字符串格式(不推荐)
如果一定要用字符串比较,必须把日期转成年/月/日或YYYYMMDD这类格式,保证字符串字典序和实际日期顺序完全一致:
# 转成年/月/日格式的字符串 ae_long['ramped_date'] = pd.to_datetime(ae_long['ramped_date'], errors='coerce').dt.strftime('%Y/%m/%d') dat = '2000/12/01' # 此时字符串比较逻辑和日期顺序一致 assert len(ae_long.loc[ae_long['ramped_date'] > dat]) == 0
总结
不是必须把dat转成datetime对象,但最稳妥、性能最优的方式是保留datetime类型进行比较——这也是Pandas官方推荐的做法,能彻底避免字符串比较带来的各种逻辑陷阱。
内容的提问来源于stack exchange,提问作者Justin Benfit
相关产品推荐
相关产品推荐

