处理大写月份缩写的日期转datetime失败问题(160万行数据)
解决大写月份缩写的日期列转换问题(附大日期集处理技巧)
我之前处理大样本数据时也碰到过这种「大写月份缩写导致datetime转换失败」的问题,结合你160万行数据的场景,给你几个实用的解决方案:
第一步:先明确日期列的格式
首先先打印日期列的前几行,确认具体格式(比如是DD-MMM-YYYY、MMM DD, YYYY还是其他):
print(test['date'].head())
方法1:指定精准的格式字符串(效率最高,优先推荐)
pandas的pd.to_datetime里的%b格式符可以匹配月份缩写,而且不区分大小写,只要你指定的格式和实际字符串匹配就行。比如如果你的日期是01-JAN-2023这种日-月缩写-年的格式,直接用:
# 转换日期列,errors='coerce'把转换失败的行转为NaT方便后续排查 test['date'] = pd.to_datetime(test['date'], format='%d-%b-%Y', errors='coerce')
如果是JAN 01, 2023这种格式,就把format改成%b %d, %Y。
方法2:先标准化字符串大小写(适配格式不统一的情况)
如果你的日期列里混合了大小写月份(比如既有JAN又有jan),可以先统一字符串格式再转换:
# 转成首字母大写的标准格式,再转换datetime test['date'] = pd.to_datetime(test['date'].str.title(), format='%d-%b-%Y', errors='coerce') # 或者全部转小写 # test['date'] = pd.to_datetime(test['date'].str.lower(), format='%d-%b-%Y', errors='coerce')
方法3:自动推断格式(适合不确定格式的场景)
如果实在搞不清具体格式,可以用infer_datetime_format=True让pandas自动推断,虽然效率比指定格式低一点,但160万行数据完全能处理:
test['date'] = pd.to_datetime(test['date'], infer_datetime_format=True, errors='coerce')
后续:计算日期差值
转换成功后,如果你需要结合日期和时间列计算完整时间差,可以先合并成完整的datetime:
# 合并日期和时间列 test['full_datetime'] = pd.to_datetime(test['date'].astype(str) + ' ' + test['time'].astype(str)) # 计算两个datetime列的差值(比如和另一列target_datetime) test['time_diff'] = test['full_datetime'] - test['target_datetime'] # 如果只需要天数差,提取.dt.days test['day_diff'] = (test['full_datetime'] - test['target_datetime']).dt.days
小提示:排查转换失败的行
用errors='coerce'后,转换失败的行会变成NaT,可以用下面的代码找到这些脏数据:
# 查看转换失败的行 print(test[test['date'].isna()])
内容的提问来源于stack exchange,提问作者HT121
相关产品推荐
相关产品推荐

