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
相关产品推荐
相关产品推荐

