处理datetime中不同长度的毫秒数位解析问题
问题:时间字符串解析时毫秒位数处理异常
我用以下代码读取CSV为DataFrame,并把object类型的time列转成datetime格式:
# 使用read_csv从CSV创建DataFrame shackles = pd.read_csv(path_data_shackles, delimiter=';') print(shackles.dtypes) # 将time列转换为datetime类型 shackles['time'] = pd.to_datetime(pd.Series(shackles['time']), format="%H:%M:%S:%f") print('') print(shackles['time'].iloc[3688]) print('') print(shackles.dtypes)
执行后输出:
DataTag object ms_Elapsed int64 Value object time object dtype: object 2023-05-02 10:54:00.760000 DataTag object ms_Elapsed int64 Value object time datetime64[ns] dtype: object
核心问题:原时间值10:54:00:76被解析成了10:54:00.760000——毫秒位被当成760ms而非76ms,导致图表显示异常。我试过先把time列转成字符串补前导零来统一成3位毫秒数,但没能成功转成字符串列,求其他解决办法。
解决方案
方法1:预处理字符串补全毫秒位到3位
先将time列转为字符串,对毫秒部分补前导零确保是3位后,再转换为datetime类型:
shackles = pd.read_csv(path_data_shackles, delimiter=';') # 处理time列的毫秒部分,补前导零到3位 shackles['time'] = shackles['time'].astype(str).apply(lambda x: x[:-2] + '0' + x[-2:] if len(x.split(':')[-1]) == 2 else x ) # 转换为datetime类型 shackles['time'] = pd.to_datetime(shackles['time'], format="%H:%M:%S:%f") print(shackles['time'].iloc[3688]) # 输出应为2023-05-02 10:54:00.076000
方法2:读取阶段直接处理时间格式
利用pd.read_csv的converters参数,在读取CSV时就完成时间格式修正:
def fix_time_format(time_str): # 拆分时间各部分,补全毫秒位到3位 parts = time_str.split(':') if len(parts[-1]) < 3: parts[-1] = parts[-1].ljust(3, '0') return ':'.join(parts) # 读取CSV时直接处理time列 shackles = pd.read_csv(path_data_shackles, delimiter=';', converters={'time': fix_time_format}) # 转换为datetime类型 shackles['time'] = pd.to_datetime(shackles['time'], format="%H:%M:%S:%f")
方法3:手动拆分时间构造标准格式
如果毫秒部分格式混乱,可拆分时间各部分手动构造标准格式后再转换:
shackles = pd.read_csv(path_data_shackles, delimiter=';') def parse_time(time_str): h, m, s, ms = time_str.split(':') # 把毫秒部分补零到3位,截取前3位避免超长 ms = ms.ljust(3, '0')[:3] # 构造带小数点的标准时间字符串 return f"{h}:{m}:{s}.{ms}" shackles['time'] = pd.to_datetime(shackles['time'].apply(parse_time), format="%H:%M:%S.%f")
以上方法均可确保10:54:00:76被正确解析为10:54:00.076000,解决毫秒位误判导致的图表异常问题。
内容的提问来源于stack exchange,提问作者Niels de Vries
相关产品推荐
相关产品推荐

