无法将DataFrame日期列转为datetime,日期过滤报错求助
解决日期过滤的TypeError及日期列转换问题
咱们一步步拆解并修复你遇到的问题:
1. 核心错误:过滤条件的笔误
你抛出TypeError的代码行:
df_toplot = df[df['state'].isin(top_states) & df['state'] > da]
这里明显是手滑写错了列名——你要和日期对象da比较的是date列,而非state列!state是存储州名的字符串列,和datetime对象做比较自然会触发类型不兼容的错误。
另外,在pandas布尔索引中,建议给每个条件单独加括号(避免运算符优先级问题),修正后的过滤代码应为:
df_toplot = df[(df['state'].isin(top_states)) & (df['date'] > da)]
2. 关于日期列类型的误解
你提到df['date']转换后还是pandas.core.series.Series类型,这是完全正常的:pd.to_datetime()不会改变列的容器类型(它依然是Series),但Series内部的每个元素已经被转换成了datetime.datetime对象。你可以通过print(df['date'].dtype)验证,会输出datetime64[ns],这说明日期转换是成功的,完全可以和da这类datetime对象做比较。
完整修正后的代码
import datetime import pandas as pd import matplotlib.pyplot as plt import numpy as np # 加载数据集并转换日期列 df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv") df['date'] = pd.to_datetime(df['date']) print(df['date'].dtype) # 验证日期类型,输出应为datetime64[ns] variable = "deaths" # 可切换为"cases" # 获取累计数值最高的10个州 d = pd.pivot_table(df, index='state', values=variable, aggfunc=np.sum) top_states = d.nlargest(10, variable, keep='first').index.values # 注意:你原代码的过滤日期是2018年,早于新冠数据起始时间,这里改成2020年后的日期 s = "2020-03-01 00:00:00.000" da = datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f') # 修正后的过滤逻辑 df_toplot = df[(df['state'].isin(top_states)) & (df['date'] > da)] # 可视化 df_toplot.pivot(index='date', columns='state', values=variable).plot() plt.yscale('log') plt.show()
额外提示
你原代码中设置的过滤日期s = "2018-06-19..."远早于纽约时报新冠数据的起始时间(2020年初),所以这个过滤条件相当于无效,建议改成2020年及以后的日期,才能实现“仅显示最近几周数据”的需求。
内容的提问来源于stack exchange,提问作者user7287292
相关产品推荐
相关产品推荐

