【问题标题】:Pandas filter df by date range and conditionPandas 按日期范围和条件过滤 df
【发布时间】:2022-01-23 05:36:15
【问题描述】:

我有一个包含 3 个日期时间列的数据框

              ItemUid   HireStart    DCompleteDate       OffHire
              14055     2021-01-01       2021-12-17      2021-01-09
              14065     2021-08-12       2021-12-17      2021-11-17
              14534     2018-12-21             NaT             NaT
              11639           NaT              NaT             NaT
              43268     2020-09-07       2020-09-03      2020-11-03
              36723     2021-01-03             Nat       2021-01-10
             

我正在尝试返回一个数据框,该数据框返回在用户输入的日期范围之间租用的项目。

即:如果用户输入:开始日期 = '2021-01-02' & 结束日期 = '2021-01-08',预期结果将是:

          ItemUid   HireStart    DCompleteDate       OffHire
          14055     2021-01-01       2021-01-23      2021-01-09
          14534     2018-12-21             NaT             NaT
          36723     2021-01-03             Nat       2021-01-10
             

我的代码:)

def date_range(df):
    start_date = input("Enter start date dd/mm/yyyy: ")
    end_date = input("Enter end date dd/mm/yyyy: ")

    df = df[(df['OffHire'] <= end_date) & 
             ((df['HireStart'].notna()) | (df['HireStart'] >= start_date))]
    
    return df

result = df_hire.apply(date_range, axis=1)

目前出现错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-60-6d4d17020cba> in <module>()
      9     return df
     10 
---> 11 result = df_hire.apply(date_range, axis=1)

4 frames
<ipython-input-60-6d4d17020cba> in date_range(df)
      3     end_date = input("Enter end date dd/mm/yyyy: ")
      4 
----> 5     df = df[(df['OffHire'] <= end_date) & 
      6              ((df['HireStart'].notna()) | (df['HireStart'] >= start_date))]
      7 

TypeError: '<=' not supported between instances of 'Timestamp' and 'str'

我可能可以修复错误,但是如何应用该功能的实现让我卡住了!

任何帮助都将不胜感激,这对我来说将是另一个教训!

提前致谢

【问题讨论】:

  • 想想如何将end_date 转换为时间戳。
  • 您在函数中使用了Actual Off Hire'ErCompleteDate,但您的df 没有这些列。此外,您的预期输出与您的日期范围不匹配。当原始行是“2021-12-17”时,输出的第一行如何获得“2021-01-23”的“DCompleteDate”?为什么“HireStart”在输入 start_date 之前包含第二行?
  • 是的,抱歉,为了清楚起见,我修改了 col 名称,但忘记更改代码

标签: python pandas datetime timedelta


【解决方案1】:

IIUC,你想要这样的东西:

#convert the date columns to datetime
df["HireStart"] = pd.to_datetime(df["HireStart"])
df["DCompleteDate"] = pd.to_datetime(df["DCompleteDate"])
df["OffHire"] = pd.to_datetime(df["OffHire"])

#convert inputs to datetime
start_date = pd.to_datetime(start_date, format="%d/%m/%Y")
end_date = pd.to_datetime(end_date, format="%d/%m/%Y")

#select the required rows
output = df[df["HireStart"].le(end_date)&df["DCompleteDate"].fillna(start_date).ge(start_date)]

【讨论】:

  • 您可以将.between(start, stop) 用于日期时间列
  • @PaulH - 如果操作在同一列上,是的。它们位于两个不同的列上。
  • getting AttributeError: 'Timestamp' object has no attribute 'le'
  • 这意味着您在单个时间戳上使用它,而不是像我所做的那样在整个列上使用它。
【解决方案2】:

我认为最好的方法是使用HireStart 作为索引并利用pandas 切片作为日期时间索引。比如:

df.set_index('HireStart')['2021-01-02':'2021-01-08']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多