You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:35:23