PyCharm下用Pandas清理列:提取时间并填充平均时间
处理Pandas混合类型列的时间提取与空值填充
直接上解决方案,分步骤落地:
1. 先明确数据场景
假设目标列名为target_col,先模拟一组和你描述一致的混合数据用于测试:
import pandas as pd # 模拟数据:包含日期、时间、字符串、浮点数 df = pd.DataFrame({ 'target_col': ['2024-05-20', '10:25:30', 'XYZ789', '3.14', '16:40:00', '2024-06-15', '08:10:15'] })
2. 提取有效时间,标记无效值为NaN
用正则匹配标准时间格式(HH:MM或HH:MM:SS),只保留符合格式的内容,其余全部设为空值:
# 正则匹配时间格式,括号用于捕获匹配到的有效时间 time_regex = r'^\d{2}:\d{2}(:\d{2})?$' df['clean_time'] = df['target_col'].str.extract(f'({time_regex})', expand=False)
这一步会自动把纯日期、字母、数字等非时间内容转为NaN,刚好满足你“原日期所在单元格设为空值”的需求。
3. 计算有效时间的平均值
时间类型无法直接求平均,需先转成秒数计算,再转回时间格式:
# 将字符串时间转为datetime类型,无效值自动转为NaT df['time_dt'] = pd.to_datetime(df['clean_time'], format='%H:%M:%S', errors='coerce') # 提取有效时间的总秒数,计算平均值 valid_seconds = df['time_dt'].dt.total_seconds().dropna() avg_total_seconds = valid_seconds.mean() # 把平均秒数转回HH:MM:SS格式 avg_time = pd.to_datetime(avg_total_seconds, unit='s').strftime('%H:%M:%S')
4. 用平均时间填充空值
直接用fillna替换空值:
df['clean_time'] = df['clean_time'].fillna(avg_time)
完整可运行代码
import pandas as pd # 替换为你的实际数据加载方式 # df = pd.read_excel('your_data.xlsx') # df = pd.read_csv('your_data.csv') # 模拟混合类型数据 df = pd.DataFrame({ 'target_col': ['2024-05-20', '10:25:30', 'XYZ789', '3.14', '16:40:00', '2024-06-15', '08:10:15'] }) # 提取有效时间 time_regex = r'^\d{2}:\d{2}(:\d{2})?$' df['clean_time'] = df['target_col'].str.extract(f'({time_regex})', expand=False) # 计算平均时间 df['time_dt'] = pd.to_datetime(df['clean_time'], format='%H:%M:%S', errors='coerce') valid_seconds = df['time_dt'].dt.total_seconds().dropna() avg_total_seconds = valid_seconds.mean() avg_time = pd.to_datetime(avg_total_seconds, unit='s').strftime('%H:%M:%S') # 填充空值 df['clean_time'] = df['clean_time'].fillna(avg_time) # 查看处理结果 print(df[['target_col', 'clean_time']])
额外提示
- 如果你的时间带AM/PM格式,需要调整正则和转换格式:正则改成
r'^\d{1,2}:\d{2}(:\d{2})?\s*(AM|PM)$',转换时用format='%I:%M:%S %p'。 - 若不需要中间列
time_dt,可以把计算逻辑合并,减少内存占用。
内容的提问来源于stack exchange,提问作者ham007
相关产品推荐
相关产品推荐

