如何用Pandas转换含缺失字段的特殊时间字符串为datetime格式?
处理缺失字段的时间字符串转datetime对象的方法
对于存在字段缺失的时间字符串(如仅毫秒、秒+毫秒等格式),直接用统一的format参数调用pd.to_datetime会报错,这里提供两种可靠的解决方法:
方法一:补全缺失字段后统一转换
先通过正则表达式提取各时间分量,补全缺失的时、分、秒、毫秒字段,生成格式统一的时间字符串,再用pd.to_datetime转换。
import pandas as pd import re data2 = [ '0', '+456ms', '+46s456ms', '+3m46s456ms' ] df2 = pd.DataFrame(data2, columns=['ts']) # 匹配时、分、秒、毫秒的正则模式 pattern = r'\+?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?(?:(\d+)ms)?' def complete_time_string(s): if s == '0': return '+0h0m0s0ms' match_result = re.match(pattern, s) # 提取各分量,缺失则用0填充 hour = match_result.group(1) or '0' minute = match_result.group(2) or '0' second = match_result.group(3) or '0' millisecond = match_result.group(4) or '0' return f'+{hour}h{minute}m{second}s{millisecond}ms' # 补全时间字符串 df2['completed_ts'] = df2['ts'].apply(complete_time_string) # 转换为datetime对象 df2['ts_datetime'] = pd.to_datetime(df2['completed_ts'], format="+%Hh%Mm%Ss%fms") print(df2)
方法二:转换为时间增量后叠加基准时间
这类时间字符串本质是时间增量,可先将其转换为pd.Timedelta对象,再与一个基准时间(如1900-01-01)相加得到datetime对象,逻辑更直观。
import pandas as pd import re data2 = [ '0', '+456ms', '+46s456ms', '+3m46s456ms' ] df2 = pd.DataFrame(data2, columns=['ts']) pattern = r'\+?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?(?:(\d+)ms)?' def str_to_timedelta(s): if s == '0': return pd.Timedelta(0) match_result = re.match(pattern, s) hour = int(match_result.group(1) or 0) minute = int(match_result.group(2) or 0) second = int(match_result.group(3) or 0) millisecond = int(match_result.group(4) or 0) return pd.Timedelta(hours=hour, minutes=minute, seconds=second, milliseconds=millisecond) # 基准时间,与第一个示例保持一致 base_timestamp = pd.Timestamp('1900-01-01') # 叠加时间增量得到datetime df2['ts_datetime'] = base_timestamp + df2['ts'].apply(str_to_timedelta) print(df2)
两种方法都能得到与完整格式转换一致的结果,方法二更贴合这类时间字符串的增量属性,处理0这类特殊值也更简便。
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

