如何清洗含小时与分钟的DataFrame列并统一转换为小时
将含小时/分钟的DataFrame列统一转换为小时单位
解决方案:通过正则提取数值与单位,批量换算
针对这类带时长单位的列,无需手动拆分后逐一处理,用正则提取数值和单位后批量换算更高效,以下分两种场景给出代码:
场景1:每行仅含单一单位(如"2小时"、"30分钟")
import pandas as pd # 示例数据 df = pd.DataFrame({'时长': ['2小时', '30分钟', '5.5小时', '45分钟']}) # 提取数值和单位 df[['数值', '单位']] = df['时长'].str.extract(r'(\d+\.?\d*)\s*(小时|分钟)') df['数值'] = df['数值'].astype(float) # 换算为小时:小时数值保持不变,分钟数值除以60 df['总小时数'] = df.apply(lambda row: row['数值'] if row['单位'] == '小时' else row['数值']/60, axis=1)
场景2:每行含混合单位(如"1小时30分钟")
如果存在同一行同时包含小时和分钟的情况,需要提取所有时长片段后求和:
import pandas as pd # 示例数据 df = pd.DataFrame({'时长': ['1小时30分钟', '2小时15分钟', '45分钟', '3小时']}) # 提取所有数值和单位(支持多行匹配) extracted = df['时长'].str.extractall(r'(\d+\.?\d*)\s*(小时|分钟)') extracted.columns = ['数值', '单位'] extracted['数值'] = extracted['数值'].astype(float) # 换算为小时并按原行分组求和 extracted['小时数'] = extracted.apply(lambda x: x['数值'] if x['单位'] == '小时' else x['数值']/60, axis=1) df['总小时数'] = extracted.groupby(level=0)['小时数'].sum()
说明
- 正则表达式
(\d+\.?\d*)\s*(小时|分钟)可以匹配整数、小数形式的时长数值,以及对应的单位; - 通过
astype(float)将提取的字符串数值转为浮点数,确保计算精度; - 混合单位场景下用
extractall捕获所有时长片段,再通过groupby(level=0)按原DataFrame的行索引分组求和,得到每行的总小时数。
内容的提问来源于stack exchange,提问作者Mick G
相关产品推荐
相关产品推荐

