【问题标题】:Filtering dataframe for previous week dates in Python在Python中过滤前一周日期的数据框
【发布时间】:2022-01-08 00:59:57
【问题描述】:

我有一个这样的数据框——

现在,我必须只过滤前一周日期的数据(不包括周六、周日)

我编写了这段 Python 代码-

today =  date.today() - timedelta(weeks = 1)
weekday = today.weekday()
prev_week_start = today - timedelta(days = weekday)
for i in range(0,5):
    prev_weekdate = today - timedelta(days = i)
    prev_weekend = prev__weekdate + timedelta(days = 4)
    next_weekstart = prev_weekdate +  timedelta(days = 14)
    next_weekdateend = next_weekstart + timedelta(days = 4)


week_dates = pd.DataFrame({"LastWeekStartDate":pd.to_datetime(['prev_weekdate']),
              "LastWeekEndDate":pd.to_datetime(['prev_weekend']),
              "NextWeekStartDate":pd.to_datetime(['next_weekstart']),
              "NextWeekEndDate":pd.to_datetime(['next_weekdateend'])})
week_dates.head()

我使用这些公式获得了所有上一周和下周开始和结束日期的正确日期。

然后我编写了以下代码来获取我的数据并使用上述数据框 - week_dates 过滤前一周的数据

df = pd.read_csv()
df['Date'] = pd.to_datetime(df.Date)

现在过滤我的数据框的行 - df ,我写了 -

df = df[(df['Date'] >= week_dates.LastWeekStartDate & df['Date'] <= week_dates.LastWeekEndDate)][["Date","Actual Call Volume","Forecasted Call Volume"]]

我收到一个错误 -

TypeError: &:'DatetimeArray' 和不支持的操作数类型 '日期时间数组'

请有人告诉我哪里出错了,或者有没有其他方法可以编写此代码。提前致谢!

【问题讨论】:

    标签: python pandas dataframe filtering


    【解决方案1】:

    使用 DataFrame.loc 添加 )( 并将 ][ 替换为 , 并使用 loc 选择 prev_week DataFrame 中的第一个值:

    df = df.loc[(df['Date'] >= prev_week.loc[0, 'Prev_week_start']) & 
                (df['Date'] <= prev_week.loc[0, 'Prev_week_start']), 
                ["Date","Actual Call Volume","Forecasted Call Volume"]]
    

    为了更简单的解决方案使用:

    Prev_week_start = date.today() - timedelta(weeks = 1)
    Prev_week_end = Prev_week_start + timedelta(days = 4)
    
    df = df.loc[(df['Date'] >= Prev_week_start) & (df['Date'] <= Prev_week_end), 
                ["Date","Actual Call Volume","Forecasted Call Volume"]]
    

    【讨论】:

    • 我试过这段代码。但现在出现错误 - ValueError: Can only compare the same-labeled Series objects
    • @UG007 - 答案已编辑。
    • 谢谢!我找到了一种更简单的方法来获得答案- df = df[(df['Date'] >= prev_week.Prev_week_start[0]) & (df['Date'] >= prev_week.Prev_week_end[0])][[ "日期","实际通话量","预测通话量"]]
    • @UG007 - 是的,有可能,添加到答案中。
    • 第二种解决方案将无法正常工作。它只是给我 7 天前的日期,而不是将星期一作为一周的开始日期。
    【解决方案2】:

    我找到了解决问题的方法。我的数据框中的“日期”列的值正在与我的函数 week_range(start) 表的整个列进行比较,这是不可能的。我需要一个标量值来过滤我的数据框。
    最简单的写法如下-

    df = df[(df['Date'] >= prev_week.Prev_week_start[0]) & (df['Date'] >= prev_week.Prev_week_end[0])][["Date","Actual Call Volume","Forecasted Call Volume"]]
    

    我只是通过添加索引 [0] 来指定 Prev_week_start 和 Prev_week_end 的索引。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2016-10-02
      • 2016-08-03
      • 2019-04-04
      • 2014-07-27
      • 2016-08-11
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多