繁体   English   中英

如何按特定月/日过滤日期的 dataframe?

[英]How to filter a dataframe of dates by a particular month/day?

所以我的代码如下:

 df['Dates'][df['Dates'].index.month == 11]

我正在做一个测试,看看我是否可以过滤月份,所以它只显示 11 月的日期,但这不起作用。 它给了我以下错误: AttributeError: 'Int64Index' object has no attribute 'month'。

如果我做

print type(df['Dates'][0])

然后我得到 class 'pandas.tslib.Timestamp',这让我相信存储在 dataframe 中的对象类型是 Timestamp 对象。 (我不确定“Int64Index”是从哪里来的……之前的错误)

我想做的是:dataframe 列包含从 2000 年初到以下格式的日期:dd/mm/yyyy。 我只想过滤 11 月 15 日至 3 月 15 日之间的日期,与年份无关。 最简单的方法是什么?

谢谢。

这是 df['Dates'] (带索引):

 0 2006-01-01 1 2006-01-02 2 2006-01-03 3 2006-01-04 4 2006-01-05 5 2006-01-06 6 2006-01-07 7 2006-01-08 8 2006-01-09 9 2006-01-10 10 2006-01-11 11 2006-01-12 12 2006-01-13 13 2006-01-14 14 2006-01-15...

使用pd.to_datetime & dt访问器

公认的答案不是解决这个问题的“熊猫”方式。 对于 select 仅包含month 11的行,使用dt访问器:

 # df['Date'] = pd.to_datetime(df['Date']) -- if column is not datetime yet df = df[df['Date'].dt.month == 11]

几天或几年同样有效,您可以用dt.daydt.year替换dt.month

除此之外,还有更多,这里有一些:

  • dt.quarter
  • dt.week
  • dt.weekday
  • dt.day_name
  • dt.is_month_end
  • dt.is_month_start
  • dt.is_year_end
  • dt.is_year_start

有关完整列表,请参阅文档

Map 和匿名 function 来计算该系列的月份并将其与 11 月的 11 进行比较。 这会给你一个 boolean 掩码。 然后,您可以使用该掩码过滤您的 dataframe。

 nov_mask = df['Dates'].map(lambda x: x.month) == 11 df[nov_mask]

我认为没有直接的方法来过滤你想要忽略年份的方式,所以试试这个。

 nov_mar_series = pd.Series(pd.date_range("2013-11-15", "2014-03-15")) #create timestamp without year nov_mar_no_year = nov_mar_series.map(lambda x: x.strftime("%m-%d")) #add a yearless timestamp to the dataframe df["no_year"] = df['Date'].map(lambda x: x.strftime("%m-%d")) no_year_mask = df['no_year'].isin(nov_mar_no_year) df[no_year_mask]

在您的代码中有两个问题。 首先,需要在过滤条件之后带上列引用。 其次,可以将“.month”与列或索引一起使用,但不能同时使用。 以下其中一项应该有效:

 df[df.index.month == 11]['Dates'] df[df['Dates'].month == 11]['Dates']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM