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

无法将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:47:29