如何在Pandas中将#h #m #s格式时间数据拆分为时分秒列?
最优解决方案:分工具场景实现时间单位拆分
这问题我日常处理数据时碰到过好几次,核心思路都是用正则匹配提取对应单位的数值,缺失的单位补0,具体实现要看你用什么工具——下面给你列几个最常用场景的最优方法:
1. Excel/Google Sheets(轻量表格处理首选)
直接用REGEXEXTRACT结合IFERROR就能搞定,不用写宏,公式复制就能用:
- h列公式:
=IFERROR(VALUE(REGEXEXTRACT(A2,"(\d+)h")),0) - m列公式:
=IFERROR(VALUE(REGEXEXTRACT(A2,"(\d+)m")),0) - s列公式:
=IFERROR(VALUE(REGEXEXTRACT(A2,"(\d+)s")),0)
原理说明:
REGEXEXTRACT(A2,"(\d+)h"):从A2单元格的字符串里提取出跟在数字后面的"h"对应的数字部分VALUE():把提取到的文本转成数值IFERROR(...,0):如果找不到对应单位(比如没有h),就返回0补位
2. Python Pandas(大数据量/自动化分析首选)
如果你的数据是在DataFrame里,写个简单的自定义函数就能批量拆分,效率很高:
import pandas as pd import re def parse_time(time_str): # 匹配所有"数字+单位"的组合 time_matches = re.findall(r'(\d+)([hms])', time_str) # 初始化默认值为0的字典 time_dict = {'h': 0, 'm': 0, 's': 0} # 把匹配到的数值填充到对应单位 for num, unit in time_matches: time_dict[unit] = int(num) # 返回Series,方便直接拆成列 return pd.Series(time_dict) # 假设你的数据列叫"Case Processing Time (sum)" df[['h', 'm', 's']] = df['Case Processing Time (sum)'].apply(parse_time)
优势:
- 支持批量处理上万行数据,比手动拖公式快N倍
- 可以灵活扩展(比如后续要处理d天的单位,只需要改字典和正则)
3. SQL(数据库内数据处理首选)
如果数据存在数据库里,可以用正则函数直接在SQL里拆分,不用导出到其他工具:
MySQL/MariaDB示例:
SELECT IFNULL(CAST(REGEXP_SUBSTR(time_col, '[0-9]+(?=h)') AS UNSIGNED), 0) AS h, IFNULL(CAST(REGEXP_SUBSTR(time_col, '[0-9]+(?=m)') AS UNSIGNED), 0) AS m, IFNULL(CAST(REGEXP_SUBSTR(time_col, '[0-9]+(?=s)') AS UNSIGNED), 0) AS s FROM your_table;
PostgreSQL示例:
SELECT COALESCE((REGEXP_MATCH(time_col, '(\d+)h'))[1]::INT, 0) AS h, COALESCE((REGEXP_MATCH(time_col, '(\d+)m'))[1]::INT, 0) AS m, COALESCE((REGEXP_MATCH(time_col, '(\d+)s'))[1]::INT, 0) AS s FROM your_table;
总结
- 日常小量数据用Excel/Google Sheets公式最快,不用写代码
- 数据分析/批量处理用Pandas最灵活高效
- 数据库内数据直接用SQL正则提取,避免数据导出导入的麻烦
内容的提问来源于stack exchange,提问作者Eren Han
相关产品推荐
相关产品推荐

