如何在Python Pandas中将格式不规则的时长转为总秒数?
处理Pandas中不规则日期时间转总秒数的方案
嘿,这问题我熟!处理Pandas里格式混乱的duration列确实挺头疼的,尤其是混合了纯时间和日期+时间格式的情况。我给你两种实用的解决方案,帮你把这些值都转成总秒数:
方法一:通用自动识别法
这个方法利用Pandas的日期时间解析特性,自动统一处理两种格式:
import pandas as pd # 假设你的DataFrame名为df,目标列是'duration' df['datetime'] = pd.to_datetime(df['duration']) # 计算每个datetime与基准日期(1900-01-01)的时间差,提取总秒数 # 纯时间会被自动解析为该基准日期的对应时间,差就是纯时长 df['total_seconds'] = (df['datetime'] - pd.Timestamp('1900-01-01')).dt.total_seconds()
逻辑说明:
- 纯时间字符串(比如
"01:30:00")会被解析为1900-01-01 01:30:00,和基准日期的差就是01:30:00,转成总秒数为5400,完全符合时长需求。 - 日期+时间格式的字符串(比如
"2023-10-05 02:15:00")会被解析为完整的datetime,和基准日期的差就是从1900年到该日期的总时长,转成秒数就是对应的总duration。
如果你的日期+时间其实是当天的时间点(只想提取当天的时分秒转成秒数),可以改成这个版本:
def get_daily_seconds(dt): return dt.hour * 3600 + dt.minute * 60 + dt.second df['datetime'] = pd.to_datetime(df['duration']) df['total_seconds'] = df['datetime'].apply(get_daily_seconds)
方法二:自定义鲁棒函数(处理异常值)
如果有些值格式特别奇怪,上面的方法报错,推荐用带异常捕获的自定义函数,更灵活:
import pandas as pd def convert_to_seconds(dur_str): try: # 先尝试把值当成纯时间转成时间差(Timedelta) td = pd.to_timedelta(dur_str) return td.total_seconds() except ValueError: try: # 转成datetime后,计算与基准日期的时间差 dt = pd.to_datetime(dur_str) delta = dt - pd.Timestamp('1900-01-01') return delta.total_seconds() except ValueError: # 遇到无法解析的值,返回NaN方便后续清洗(可按需修改) return pd.NA df['total_seconds'] = df['duration'].apply(convert_to_seconds)
逻辑说明:
这个函数会优先尝试解析纯时间格式,失败后再尝试解析日期+时间格式,还能处理无法解析的异常值,返回NaN避免整个代码崩溃,适合格式特别混乱的数据集。
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

