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

如何用正则表达式转换ISO 8601 PT格式时长为秒?含DataFrame列处理

关于ISO 8601时长转换的解决方案

嘿,我来帮你搞定这两个问题!不管是单个时长字符串转秒,还是批量处理DataFrame列,都有不少实用的方法,咱们一步步说:

1. 单个PT格式时长转秒数

你的正则思路没问题,但可以优化得更顺手:

优化版正则写法

直接让捕获组只提取数字,不用带单位,省掉后续处理单位的步骤:

import re
def iso_to_sec(duration):
    # 用非捕获组(?:...)包裹单位,捕获组只拿数字
    match = re.match(r'PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?', duration)
    hours = int(match.group(1)) if match.group(1) else 0
    minutes = int(match.group(2)) if match.group(2) else 0
    seconds = int(match.group(3)) if match.group(3) else 0
    return hours * 3600 + minutes * 60 + seconds

试一下iso_to_sec("PT7M37S"),直接返回457,完美~

更灵活的正则方法

用re.findall一次性抓所有数字和单位,再计算总和,这种写法不管单位顺序(虽然ISO标准是H→M→S,但万一遇到不规范的格式也能处理):

def iso_to_sec_v2(duration):
    parts = re.findall(r'(\d+)([HMS])', duration)
    unit_map = {'H': 3600, 'M': 60, 'S': 1}
    return sum(int(num) * unit_map[unit] for num, unit in parts)

比如iso_to_sec_v2("PT1H2M3S")会返回3723,非常简洁。


2. DataFrame列批量转换为秒数

针对DataFrame的批量处理,优先用向量化操作,比逐行apply高效得多:

方法1:Pandas向量化提取计算(推荐大数据量)

用str.extract一次性把所有行的小时、分钟、秒提取出来,再计算总秒数:

import pandas as pd

# 假设你的DataFrame是df,目标列叫duration
# 提取各部分数值,空值会自动设为NaN
df[['hours', 'minutes', 'seconds']] = df['duration'].str.extract(r'PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?')
# 把空值填充为0,转成整数类型
df[['hours', 'minutes', 'seconds']] = df[['hours', 'minutes', 'seconds']].fillna(0).astype(int)
# 计算总秒数
df['total_seconds'] = df['hours'] * 3600 + df['minutes'] * 60 + df['seconds']

这种方法利用Pandas的底层优化,处理几十万行数据也很快。

方法2:自定义函数+apply(适合小数据量)

如果数据量不大,直接用前面的自定义函数加apply就行,代码更简洁:

df['total_seconds'] = df['duration'].apply(iso_to_sec_v2)

方法3:第三方库一键解决(最省心)

要是允许用第三方库,isodate可以直接解析ISO时长,不用自己写正则:

from isodate import parse_duration

df['total_seconds'] = df['duration'].apply(lambda x: parse_duration(x).total_seconds())

记得先安装库:pip install isodate,这个方法最省脑子~

内容的提问来源于stack exchange,提问作者Abhinav Dixit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:14:44