按年份过滤大型数据集

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),因为它们不打算保存整数 0pd.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']

【讨论】:

完美。谢谢!

以上是关于按年份过滤大型数据集的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中有效地逐步过滤大型数据集

TCheckBox 按字段过滤数据集

Excel VBA 按用户 ID 和类别汇总大型数据集

Angular.Js 性能、大型数据集、ng-repeat、带有过滤器和双向绑定的 html 表

在R中具有相同组ID的另一个数据帧中按值过滤分组数据帧

根据上个月和年份过滤火花数据框