按时间范围过滤数据集时触发TypeError:str与Timestamp无法比较
问题解决:时间范围过滤时的类型不匹配问题
问题根源分析
- 初始报错
TypeError: '>=' not supported between instances of 'str' and 'Timestamp':
你的DataFrame索引的dateTime层级是字符串类型,但你把time_from/time_to转成了Timestamp类型,两种类型无法直接比较,导致报错。 - 修改后返回空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
相关产品推荐
相关产品推荐

