如何检查DataFrame中starttime与endtime列的缺失时间值
解决DataFrame中starttime/endtime列缺失时间值的问题
核心问题排查与修复步骤
1. 先确认时间列的类型有效性
首先必须保证starttime和endtime是标准的datetime64类型,否则无法和pd.date_range生成的时间序列匹配:
# 转换为datetime类型(若尚未转换) allmerged['starttime'] = pd.to_datetime(allmerged['starttime'], errors='coerce') allmerged['endtime'] = pd.to_datetime(allmerged['endtime'], errors='coerce') # 检查是否有无效时间值(NaT) print("starttime无效值数量:", allmerged['starttime'].isna().sum()) print("endtime无效值数量:", allmerged['endtime'].isna().sum())
2. 生成匹配粒度的完整时间序列
原代码未显式指定时间频率,默认是天级(freq='D'),但你需要的是小时级序列,必须明确指定:
# 生成2019-2022年每小时的完整时间序列 full_hourly_range = pd.date_range( start='2019-01-01 00:00:00', end='2022-12-31 23:00:00', freq='H' # 强制小时级频率 )
3. 提取现有时间并对比缺失值
原代码错误地使用了allmerged.index,但你的时间值存在starttime/endtime列而非索引,需直接针对列操作:
# 检查starttime列的缺失时间 existing_starts = allmerged['starttime'].drop_duplicates() missing_starts = full_hourly_range.difference(existing_starts) # 检查endtime列的缺失时间 existing_ends = allmerged['endtime'].drop_duplicates() missing_ends = full_hourly_range.difference(existing_ends)
4. 可视化缺失结果(可选)
将缺失值转为DataFrame方便查看:
missing_starts_df = pd.DataFrame({'缺失的starttime': missing_starts}) print(missing_starts_df.head(10))
原代码失效的常见原因
- 索引不匹配:你误将DataFrame的默认数字索引当作时间索引,而实际时间值存在
starttime/endtime列中 - 频率不一致:未指定
freq='H'导致生成的是天级序列,和你需要的小时级数据无法对齐 - 时间格式错误:
starttime/endtime中存在非标准时间字符串,转换时生成NaT无效值,干扰对比结果
内容的提问来源于stack exchange,提问作者J1999
相关产品推荐
相关产品推荐

