按年份过滤大型数据集
Posted
技术标签:
【中文标题】按年份过滤大型数据集【英文标题】:Filtering large data set by year 【发布时间】:2021-11-21 20:26:38 【问题描述】:使用我需要能够按年份过滤的非常大的数据集。我将文本文件读取为 csv:
df1=pd.read_csv(filename,
sep="\t",
error_bad_lines=False,
usecols=['ID','Date', 'Value1', 'Value2'])
并将日期列转换为日期:
df1['Date'] = pd.to_datetime(df1['Date'], errors='coerce')
我还将所有空值都转换为零:
df2=df1.fillna(0)
此时,我的“日期”字段被列为 dtype“对象”,日期格式如下:
2018-02-09 00:00:00
但是,我不确定如何按年份进行过滤。当我尝试这段代码时:
df3 = df2[df2['Date'].dt.year == 2018]
我收到此错误:
AttributeError: Can only use .dt accessor with datetimelike values
我认为正在发生的事情是某些日期已被读取为空值,但我不确定是否是这种情况,并且我不确定如何将它们转换为日期(零日期很好)。
我过滤数据集的代码是否正确?如何解决此属性错误?
谢谢!
【问题讨论】:
当您执行df2=df1.fillna(0)
时,您会不必要地向上转换某些数据类型(datetime64[ns]
、bool
),因为它们不打算保存整数 0
。 pd.to_datetime
已经用适当的空值pd.NaT
填充了错误值,所以不要用 0 填充该列。
修复了它。谢谢!
【参考方案1】:
您也可以在阅读时指定解析Date
。正如@ALollz 提到的,您在Date
中有一些NaN 值,当您将它们替换为0 时,这会更改列的类型。如果您只想按年份过滤,那么下面的代码应该可以工作。如果您想按年/月过滤,请使用 '%Y-%m
和年/月/日使用 '%Y-%m-%d'
。
df1=pd.read_csv(filename,
sep="\t",
error_bad_lines=False,
usecols=['ID','Date', 'Value1', 'Value2']
parse_dates=['Date'])
df_filtered = df1[df1['Date'].dt.strftime('%Y') == '2018']
【讨论】:
完美。谢谢!以上是关于按年份过滤大型数据集的主要内容,如果未能解决你的问题,请参考以下文章