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

按时间范围过滤数据集时触发TypeError:str与Timestamp无法比较

问题解决:时间范围过滤时的类型不匹配问题

问题根源分析

  1. 初始报错TypeError: '>=' not supported between instances of 'str' and 'Timestamp':
    你的DataFrame索引的dateTime层级是字符串类型,但你把time_from/time_to转成了Timestamp类型,两种类型无法直接比较,导致报错。
  2. 修改后返回空DataFrame:
    你错误地将time_from赋值为字符串'pd.to_datetime(time_from)',此时是拿这个固定字符串和索引里的时间字符串做比较,自然没有匹配结果,返回空。

正确解决方案

方案1:将索引的dateTime层级转为datetime类型(推荐)

直接把索引里的时间字符串统一转成datetime类型,后续时间过滤就不会有类型问题:

def site_data(df, site_name, time_from=None, time_to=None, columns=None):
    # 先处理索引的dateTime层,转为datetime类型
    df = df.reset_index(level='dateTime')
    df['dateTime'] = pd.to_datetime(df['dateTime'])
    df = df.set_index('dateTime', append=True)
    
    for name in site_name:
        site_data = df.xs(name, level='site')  # 修正原代码循环变量使用错误
        
        if time_from is not None:
            time_from = pd.to_datetime(time_from)
        if time_to is not None:
            time_to = pd.to_datetime(time_to)
        
        if time_from is not None:
            site_data = site_data[site_data.index.get_level_values('dateTime') >= time_from] 
        if time_to is not None:
            site_data = site_data[site_data.index.get_level_values('dateTime') <= time_to]

        if columns is not None:
            site_data = site_data[columns]
        return site_data

方案2:将time_from/time_to转为和索引一致的字符串格式

如果不想修改索引类型,就把传入的时间参数转成和索引dateTime层完全一致的字符串格式:

def site_data(df, site_name, time_from=None, time_to=None, columns=None):
    # 替换为你实际索引dateTime层的字符串格式,比如'%Y-%m-%d %H:%M:%S'
    time_format = '%Y-%m-%d %H:%M:%S'
    
    for name in site_name:
        site_data = df.xs(name, level='site')
        
        if time_from is not None:
            # 先转成Timestamp,再转成和索引一致的字符串格式
            time_from = pd.to_datetime(time_from).strftime(time_format)
        if time_to is not None:
            time_to = pd.to_datetime(time_to).strftime(time_format)
        
        if time_from is not None:
            site_data = site_data[site_data.index.get_level_values('dateTime') >= time_from] 
        if time_to is not None:
            site_data = site_data[site_data.index.get_level_values('dateTime') <= time_to]

        if columns is not None:
            site_data = site_data[columns]
        return site_data

额外注意点

原代码的for name in site_name循环逻辑存在问题:第一次循环就执行return site_data,只会处理第一个site_name元素,后续元素不会被执行。如果需要处理所有站点并返回合并结果,可以收集每个站点的数据后用pd.concat合并。

内容的提问来源于stack exchange,提问作者lala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:33:13