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

如何将分:秒:纳秒格式字符串列转为保留总分钟的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:15:01