【问题标题】: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 填充该列。
  • 修复了它。谢谢!

标签: python pandas datetime large-data


【解决方案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']

【讨论】:

  • 完美。谢谢!
猜你喜欢
  • 2021-07-06
  • 2021-03-24
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多