如何将分:秒:纳秒格式字符串列转为保留总分钟的datetime列
解决方案
核心原因
标准时间解析库的%M格式符默认仅支持0~59的分钟取值,超过60的分钟会自动进位为小时,这是内置规则,无法通过修改解析参数直接跳过。所以需要先拆分时间字符串的各个字段,再手动构造目标类型。
常见场景实现方案
1. Pandas处理数据列(最常用的批量处理场景)
如果你需要可直接参与时间运算的时间类型,推荐用timedelta:
timedelta本身为时间差类型,天然支持超过60的分钟取值,不需要强制进位:
import pandas as pd # 示例数据 df = pd.DataFrame({'raw_time': ['210:39:00', '29:23:00']}) # 拆分字符串为总分钟、秒、纳秒三个整数字段 df[['total_min', 'sec', 'ns']] = df['raw_time'].str.split(':', expand=True).astype(int) # 构造timedelta列 df['time_val'] = pd.to_timedelta(df['total_min'], unit='m') \ + pd.to_timedelta(df['sec'], unit='s') \ + pd.to_timedelta(df['ns'], unit='ns')
如果你必须使用datetime类型:
datetime类型强制包含年月日信息,你可以固定一个基准日期,把时间差叠加到基准日期上即可:
# 自定义基准日期,可根据业务调整 base_dt = pd.Timestamp('1900-01-01') df['datetime_val'] = base_dt + df['time_val']
按%M:%S:%f格式输出(分钟不进位):
因为内置strftime的%M仅输出0~59的分钟,所以需要用原始拆分的总分钟数手动格式化:
df['formatted_time'] = df.apply( lambda x: f"{x['total_min']}:{x['sec']:02d}:{x['ns']:06d}", axis=1 )
2. 原生Python处理单个值
from datetime import datetime, timedelta raw_str = "210:39:00" total_min, sec, ns = map(int, raw_str.split(':')) # 构造timedelta time_td = timedelta(minutes=total_min, seconds=sec, microseconds=ns/1000) # 构造datetime time_dt = datetime(1900, 1, 1) + time_td # 格式化输出 formatted_str = f"{total_min}:{sec:02d}:{ns:06d}"
内容的提问来源于stack exchange,提问作者mh4486
相关产品推荐
相关产品推荐

