如何在pandas中处理含可选小时的混合时长格式?
处理混合格式跑步时长的转换方案
解决这个问题的核心是区分两种时长格式,并且用适合表示时间间隔的timedelta类型处理,而非用于表示具体时间点的datetime(这也是之前报错的根本原因)。下面提供两种实用方案:
方法一:统一格式后转换为时间间隔对象
通过字符串中冒号的数量区分格式,给%M:%S格式的字符串补上前缀0:,统一为%H:%M:%S格式后,用pd.to_timedelta转换为标准时间间隔对象。
import pandas as pd df = pd.DataFrame({'time': ['1:01:16','1:05:11','1:08:43','1:03:30','57:43']}) # 统一格式:给只有1个冒号的字符串添加前缀0: df['formatted_time'] = df['time'].apply(lambda s: f"0:{s}" if s.count(':') == 1 else s) # 转换为timedelta类型(表示时间间隔) df['duration'] = pd.to_timedelta(df['formatted_time']) # 可选:提取常用的数值指标 df['total_seconds'] = df['duration'].dt.total_seconds() df['total_minutes'] = df['duration'].dt.total_seconds() / 60 print(df)
输出结果:
time formatted_time duration total_seconds total_minutes 0 1:01:16 1:01:16 0 days 01:01:16 3676.0 61.266667 1 1:05:11 1:05:11 0 days 01:05:11 3911.0 65.183333 2 1:08:43 1:08:43 0 days 01:08:43 4123.0 68.716667 3 1:03:30 1:03:30 0 days 01:03:30 3810.0 63.500000 4 57:43 0:57:43 0 days 00:57:43 3463.0 57.716667
方法二:手动拆分计算总秒数
如果不需要保留timedelta对象,直接拆分字符串计算总秒数更直接:
import pandas as pd df = pd.DataFrame({'time': ['1:01:16','1:05:11','1:08:43','1:03:30','57:43']}) def convert_to_seconds(time_str): parts = list(map(int, time_str.split(':'))) if len(parts) == 2: # 格式为 分:秒 minutes, seconds = parts return minutes * 60 + seconds elif len(parts) == 3: # 格式为 时:分:秒 hours, minutes, seconds = parts return hours * 3600 + minutes * 60 + seconds df['total_seconds'] = df['time'].apply(convert_to_seconds) df['total_minutes'] = df['total_seconds'] / 60 print(df)
为什么之前的方法会报错?
- 用
pd.to_datetime指定%H:%M:%S格式时,57:43缺少小时部分,不符合格式要求,触发ValueError。 - 用
format='mixed'时,pandas会把57:43误判为%H:%M格式(把57当成小时),但小时范围必须是0-23,因此触发DateParseError。本质是datetime用于处理具体时间点,不适合表示跑步这类时间间隔。
内容的提问来源于stack exchange,提问作者Samovian
相关产品推荐
相关产品推荐

