You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

时间序列重采样遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:27:40