如何将Pandas DataFrame中可变长度的时长列转为datetime类型
解决可变位数时长字符串转时间类型的问题
你遇到的问题根源是pd.to_datetime的format参数要求固定位数的匹配规则:HH、MM、SS强制对应两位数字,但你的数据里时、分、秒的位数是可变的(比如123h是三位小时、1h是一位小时),所以格式匹配失败。
更适合处理这种时长数据的工具是pd.to_timedelta(时间差类型),下面提供两种简洁的解决方案:
方案一:直接修改字符串格式后转换
pd.to_timedelta支持识别类似123h23m1s的格式,所以只需要把原字符串中的冒号去掉即可:
import pandas as pd # 示例数据 df = pd.DataFrame({'col': ['123h:23m:1s', '1h:1m:1s', '12h:0m:14s']}) # 去掉冒号后直接转成timedelta df['duration'] = pd.to_timedelta(df['col'].str.replace(':', ''))
方案二:提取数值后构造时间差
如果需要更灵活的控制(比如单独处理时/分/秒),可以用正则提取各部分数值,再构造timedelta:
# 用正则提取时、分、秒的数字 df[['hours', 'minutes', 'seconds']] = df['col'].str.extract(r'(\d+)h:(\d+)m:(\d+)s', expand=True).astype(int) # 构造时间差列 df['duration'] = pd.to_timedelta(df['hours'], unit='h') + pd.to_timedelta(df['minutes'], unit='m') + pd.to_timedelta(df['seconds'], unit='s')
如果需要转成datetime类型
如果你的需求是基于某个起始日期生成具体的datetime,可以先转成timedelta,再加上起始日期:
start_datetime = pd.to_datetime('2024-01-01 00:00:00') df['datetime'] = start_datetime + df['duration']
内容的提问来源于stack exchange,提问作者Evan Brittain
相关产品推荐
相关产品推荐

