【问题标题】:How to filter pandas dataframe based on date value with exact match如何根据精确匹配的日期值过滤熊猫数据框
【发布时间】:2018-03-09 05:48:29
【问题描述】:

我一直在尝试过滤特定日期的数据框,尽管日期存在于数据框中,但它没有返回任何结果

基于查询的数据框中的数据

df[df['Date'] > '2017-03-20']

返回这个结果

StaffID     Date        
90047   2017-03-20 19:00:00     
90049   2017-03-20 19:00:00     
90049   2017-03-27 19:00:00     

虽然当我运行这个查询时

df[df['Date'] == '2017-03-20']

df.loc[df['Date'] == '2017-03-20']

它根本没有返回任何结果,只是一个空的数据框

StaffID     Date

我的数据框列类型是

StaffID                int64
Date          datetime64[ns]

我已经通过比较数据框日期与字符串以及将 字符串日期 转换为 datetime64[ns] 来尝试上述查询,结果仍然相同,请提供帮助将不胜感激

【问题讨论】:

  • 在过滤之前添加df.Date=df.Date.dt.date
  • 还是一样的结果
  • @Waqar 因为 '2017-03-20' 被视为 '2017-03-20 00:00:00' 这显然小于 '19:00:00',所以你需要如温所说,过滤日期。
  • 结果还是一样@Wen
  • 伟大的 nvm 必须将匹配的日期转换为 numpy.datetime64 或 datetime.datetime.date,谢谢!

标签: python pandas numpy dataframe


【解决方案1】:

使用 dt.date astype 字符串然后比较即

df[df['Date'].dt.date.astype(str) == '2017-03-20']

输出:

员工 ID 日期 0 90047 2017-03-20 19:00:00 1 90049 2017-03-20 19:00:00

【讨论】:

  • 这将比上面的代码更快:df[df['Date'].dt.date == pd.to_datetime('2017-03-20')] 每行都不需要转换为字符串。
【解决方案2】:

你可以做字符串比较

df[df['Date'].astype(str).str[:10] == '2017-03-20']


    StaffID Date
0   90047   2017-03-20 19:00:00
1   90049   2017-03-20 19:00:00

【讨论】:

    【解决方案3】:

    我使用的日期是 '2017-03-20 19:00:00' 大于 '2017-03-20 00:00:00' > 这就是为什么它没有正确比较它的最佳方法是

    df.Date = df.Date.dt.date
    dateToMatch = np.datetime64('2017-03-20')
    df[df.Date == dateToMath]
    

    以上代码返回

       StaffID     Date
    0   90047   2017-03-20
    1   90049   2017-03-20
    

    这只会从我的日期列中提取日期并替换有时间的旧列

    贷方:文在评论中回答了我。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 2019-02-17
      • 2020-05-05
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2020-08-08
      相关资源
      最近更新 更多