如何用正则表达式转换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
相关产品推荐
相关产品推荐

