时间序列重采样遇TypeError:float与str无法比较,寻求解决方案
解决按分组填充小时级时间序列缺失值的问题
我来帮你搞定这个坑!你遇到的核心问题要么是数据类型没彻底转对,要么是resample的用法和你的数据结构不匹配,咱们一步步来解决:
第一步:彻底清理并确认time列的类型
你之前转datetime的思路是对的,但大概率有脏数据没处理干净(比如混了float类型的NaN或无法转换的字符串),才会触发类型比较错误。先执行这段代码把time列彻底转成datetime:
# 强制转换time列为datetime,转不动的设为NaN方便排查 df['time'] = pd.to_datetime(df['time'], errors='coerce') # 检查有没有转换失败的行(如果有,先处理这些脏数据) invalid_rows = df[df['time'].isna()] if not invalid_rows.empty: print("发现无法转换的time值,建议先处理:") print(invalid_rows) # 可以选择删除这些行或者手动修复格式 df = df.drop(invalid_rows.index) # 确认类型是否正确 print(df['time'].dtype) # 正常应该输出 datetime64[ns]
第二步:用分组+重索引的方式填充缺失时间
之前的resample报错,很大概率是因为你既把time设为了索引,又在resample里指定on='time',导致pandas混淆了索引和目标列。换个更稳妥的方式:对每个分组单独生成连续的小时时间序列,再填充数据:
def fill_group_time(group): # 先把分组内的时间排序,确保顺序正确 group_sorted = group.sort_values('time') # 生成该分组从最早到最晚时间的连续小时序列 full_time_range = pd.date_range( start=group_sorted['time'].min(), end=group_sorted['time'].max(), freq='H' ) # 把原分组的time设为索引,重索引到连续时间,用ffill填充其他列 group_filled = group_sorted.set_index('time').reindex(full_time_range).ffill() # 把索引转回time列,重置索引 group_filled = group_filled.reset_index().rename(columns={'index': 'time'}) return group_filled # 对每个LCLid分组应用处理函数 df_filled = df.groupby('LCLid').apply(fill_group_time).reset_index(drop=True)
为什么之前的方法会报错?
你碰到的TypeError: '<' not supported between instances of 'float' and 'str',通常是这两个原因:
time列里存在混合类型(比如部分是float格式的NaN,部分是字符串格式的时间),就算转了datetime,残留的类型冲突还是会触发错误- 同时使用
set_index('time')和resample(..., on='time'),让pandas搞不清该用索引还是指定列,引发类型比较逻辑混乱
最后验证结果
可以用这段代码检查填充后的时间是否连续:
# 挑一个分组查看时间间隔的分布 sample_id = df_filled['LCLid'].iloc[0] print(df_filled[df_filled['LCLid'] == sample_id]['time'].diff().value_counts()) # 正常情况应该只有3600秒(1小时)的差值
内容的提问来源于stack exchange,提问作者k_bm
相关产品推荐
相关产品推荐

