如何移除pd.to_datetime未转换值的字符串后缀并转为datetime
问题描述
尝试使用pd.to_datetime(df, format='%Y-%m-%d_%H-%M-%S')将日期列转换为datetime类型时,收到错误ValueError: unconverted data remains: .1。排查发现date列中有119条(共1037808条)数据末尾带有多余的.1,其余日期格式正常。尝试data.date = data.date.replace(".1", "")和data = data.replace(".1", "")均无法移除该后缀,需要仅移除这些日期末尾的.1后将列转换为datetime类型。
问题复现代码:
import pandas as pd data = pd.DataFrame({"date" : ["2022-01-15_08-11-00.1","2022-01-15_08-11-30","2022-01-15_08-12-00.1", "2022-01-15_08-12-30"], "value" : [1,2,3,4]})
期望最终结果:
data = pd.DataFrame({"date" : ["2022-01-15_08-11-00","2022-01-15_08-11-30","2022-01-15_08-12-00", "2022-01-15_08-12-30"], "value" : [1,2,3,4]})
解决方案
方法1:正则精准替换末尾的.1(推荐)
Pandas的Series.replace默认不启用正则,且是全局替换,无法精准匹配末尾的.1。改用str.replace配合正则表达式,只替换字符串末尾的.1:
# 仅移除日期字符串末尾的.1 data['date'] = data['date'].str.replace(r'\.1$', '', regex=True) # 转换为datetime类型 data['date'] = pd.to_datetime(data['date'], format='%Y-%m-%d_%H-%M-%S')
正则r'\.1$'说明:\.匹配点号(避免被当作正则通配符),$表示匹配字符串结尾,确保只处理带.1后缀的日期。
方法2:直接让pd.to_datetime自动解析
如果不需要保留原字符串格式,可跳过手动替换,让pd.to_datetime自动识别格式:
data['date'] = pd.to_datetime(data['date'], errors='coerce')
注意:此方法效率略低于指定format,适合数据量较小的场景;百万级数据优先选方法1。
方法3:用str.rstrip移除固定后缀
若确认所有多余后缀都是.1,可直接用str.rstrip移除末尾的.1字符:
data['date'] = data['date'].str.rstrip('.1') # 后续转换datetime data['date'] = pd.to_datetime(data['date'], format='%Y-%m-%d_%H-%M-%S')
内容的提问来源于stack exchange,提问作者R_Dax
相关产品推荐
相关产品推荐

