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

Pandas如何基于现有数据生成天.时:分:秒格式时间差结果

问题背景

需要基于测试数据推导天、时、分、秒结构的时间戳,目标输出格式为12.22:05:38.3911208。
最小复现数据集:

import pandas as pd
df = pd.DataFrame({
                   'wrong_ts': '1970-01-13T22:05:38.391+0000',
                   'minutes': 18605,
                   'seconds': 38,
                   'ms': 391,
                   'expected': '12.22:05:38.3911208'})

当前实现的输出存在两个偏差:

  • 结果自带days文本标识,不符合格式要求
  • 时间小数位精度不足,和预期结果不匹配
    当前错误实现代码与输出:
df['duration'] = df['minutes'].astype(str) + 'm ' + df['seconds'].astype(str) + 's ' +  df['ms'].astype(str) + 'ms'
pd.to_timedelta(df.duration)
# 输出:12 days 22:05:38.391000
实现方案

pd.to_timedelta默认字符串输出自带单位标识,无法直接生成目标格式,需要拆分时间组件手动拼接;另外预期结果的7位小数精度无法仅通过分、秒、毫秒三个字段推导(毫秒字段仅支持3位小数),需要从原始时间戳字段提取剩余的微秒部分补全精度,代码如下:

# 基于数值字段生成精确的timedelta对象,避免字符串拼接解析误差
td = pd.to_timedelta(df['minutes'], unit='m') + pd.to_timedelta(df['seconds'], unit='s') + pd.to_timedelta(df['ms'], unit='ms')

# 提取天数字段
day_part = td.days.astype(str)
# 提取时、分、秒字段,固定为两位数字格式
hms_part = td.apply(lambda x: f"{x.components.hours:02d}:{x.components.minutes:02d}:{x.components.seconds:02d}")
# 从原始时间戳提取7位小数秒部分,补全精度
frac_part = df['wrong_ts'].str.split(r'[.+]').str[1].str[:7].str.ljust(7, '0').str.replace('+', '')

# 按目标格式拼接
df['formatted_ts'] = day_part + '.' + hms_part + '.' + frac_part

执行后输出结果与预期完全一致:

0    12.22:05:38.3911208
Name: formatted_ts, dtype: object

提示:如果高精度小数秒存储在其他字段,替换对应字段提取即可;如果不需要7位精度,可直接通过timedelta的microseconds组件自行拼接对应长度的小数位。

内容的提问来源于stack exchange,提问作者John Stud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:51:42