拆分DataFrame列中嵌套日期列表并计算平均小时数
解决方案
问题分析
你原来的代码只处理了每个单元格第一个空格后的内容,没覆盖逗号分隔的所有时间项,所以无法实现需求。需要针对每个时间项单独提取时分秒,再计算小时平均值。
处理步骤与代码
1. 提取时分秒,重构date_time列
通过拆分每个逗号分隔的时间项,去除日期部分只保留时分秒,再重新拼接:
df['date_time'] = df['date_time'].apply( lambda x: ','.join([t.strip().split()[1] for t in x.split(',')]) )
x.split(','):将单元格字符串按逗号拆分为独立时间项t.strip():清除时间项前后的空格(兼容逗号后有无空格的情况)split()[1]:拆分日期和时间部分,取后面的时分秒字符串','.join(...):将提取的时分秒用逗号拼接回原格式
2. 计算平均小时数AVG_hour
提取每个时分秒的小时部分,计算平均值后取整:
df['AVG_hour'] = df['date_time'].apply( lambda x: round( sum(int(t.split(':')[0]) for t in x.split(',')) / len(x.split(',')) ) )
t.split(':')[0]:提取单个时间的小时数并转为整数sum(...) / len(...):计算该行所有时间的小时平均值round():对平均值四舍五入取整,与预期结果一致
完整可运行代码
import pandas as pd # 构造示例DataFrame data = { 'ID': [1, 2, 3], 'date_time': [ '2020-03-13 21:10:56, 2020-06-02 22:18:06, 2020-04-14 22:10:56, 2021-06-02 22:18:06', '2010-09-13 21:43:09, 2011-05-04 23:08:15,2012-06-04 23:08:16', '2013-06-14 23:29:17, 2014-08-13 23:20:22,2014-08-13 23:20:22' ] } df = pd.DataFrame(data) # 处理date_time列 df['date_time'] = df['date_time'].apply( lambda x: ','.join([t.strip().split()[1] for t in x.split(',')]) ) # 计算平均小时 df['AVG_hour'] = df['date_time'].apply( lambda x: round(sum(int(t.split(':')[0]) for t in x.split(',')) / len(x.split(','))) ) print(df)
运行结果
| ID | date_time | AVG_hour |
|---|---|---|
| 1 | 21:10:56,22:18:06,22:10:56,22:18:06 | 22 |
| 2 | 21:43:09,23:08:15,23:08:16 | 22 |
| 3 | 23:29:17,23:20:22,23:20:22 | 23 |
(注:原示例中ID3的AVG_hour标注为22应为笔误,实际计算平均值为23)
内容的提问来源于stack exchange,提问作者d9d9
相关产品推荐
相关产品推荐

