【问题标题】:How can I select the earliest date from a dataframe after a given cutoff date?如何在给定的截止日期之后从数据框中选择最早的日期?
【发布时间】:2022-01-12 17:26:43
【问题描述】:

我有三个数据框,一个包含截止日期,一个包含交货日期,第三个包含订单

import pandas as pd
cutoff = pd.DataFrame({'State': ['New Jersey','Idaho','Hawaii','Oklahoma'], 
         'January': ['2022-01-10','2022-01-17','2022-01-11','2022-01-15'],
         'February': ['2022-02-15','2022-02-17','2022-02-11','2022-02-15'],
         'March': ['2022-03-15','2022-04-17','2022-03-11','2022-03-15'],
         'April': ['2022-04-15','2022-04-17','2022-04-11','2022-04-15'],
         'May': ['2022-05-15','2022-05-17','2022-05-11','2022-05-15'],
         'June': ['2022-06-15','2022-06-17','2022-06-11','2022-06-15'],
         'July': ['2022-07-15','2022-07-17','2022-07-11','2022-07-15'],
         'August': ['2022-08-15','2022-08-17','2022-08-11','2022-08-15'],
         'September': ['2022-09-15','2022-09-17','2022-09-11','2022-09-15'],
         'October': ['2022-10-15','2022-10-17','2022-10-11','2022-10-15'],
         'November': ['2022-11-15','2022-11-17','2022-11-11','2022-11-11'],
         'December': ['2022-12-15','2022-12-17','2022-12-11','2022-12-15']})

deliverydates = pd.DataFrame({'State': ['New Jersey','Idaho','Hawaii','Oklahoma'], 
         'January': ['2022-01-31','2022-01-30','2022-01-29','2022-01-31'],
         'February': ['2022-02-28','2022-02-27','2022-02-28','2022-02-28'],
         'March': ['2022-03-31','2022-04-30','2022-03-29','2022-03-31'],
         'April': ['2022-04-30','2022-04-30','2022-04-29','2022-04-30'],
         'May': ['2022-05-31','2022-05-30','2022-05-29','2022-05-31'],
         'June': ['2022-06-30','2022-06-30','2022-06-29','2022-06-30'],
         'July': ['2022-07-31','2022-07-30','2022-07-29','2022-07-31'],
         'August': ['2022-08-31','2022-08-30','2022-08-29','2022-08-31'],
         'September': ['2022-09-30','2022-09-30','2022-09-29','2022-09-30'],
         'October': ['2022-10-31','2022-10-30','2022-10-29','2022-10-31'],
         'November': ['2022-11-30','2022-11-30','2022-11-29','2022-11-11'],
         'December': ['2022-12-31','2022-12-30','2022-12-11','2022-12-31']})

orders =  pd.DataFrame({'Person': ['Lee','Smith','Johnson','Garcia'], 
         'State': ['New Jersey','Idaho','Hawaii','Oklahoma']})

我需要创建一个测试,将今天的日期与截止日期进行比较,并为每个订单分配下一个可能的交货日期。例如,今天是 1 月 12 日。史密斯在爱达荷州。 1 月 12 日早于爱达荷州的 1 月截止日期(1 月 15 日),因此他的交货日期是 2022 年 1 月 30 日。

然而,李在新泽西。今天 (1/12) 在 1 月截止日期 (1/10) 之后,因此他的交货日期现在是下一个最早交货日期 (2/28)。

我们的目标是将正确的交货日期合并到订单数据框中,以获得如下结果:

Person State Delivery Date
Lee New Jersey 2022-02-28
Smith Idaho 2022-01-30
Johnson Hawaii 2022-02-28
Garcia Oklahoma 2022-01-31

如果今天是 2 月 12 日,则需要选择下一个可能的交货日期,依此类推。

关于如何做到这一点的任何想法?谢谢!

【问题讨论】:

    标签: python pandas dataframe date


    【解决方案1】:

    建议的解决方案如下。它使用按“状态”分组来获取组中的下一个项目,在过滤系列后使用grouped.first() 以仅允许满足测试条件的日期(在今天之后)

    import datetime
    today = datetime.datetime.today().strftime('%Y-%m-%d')
    
    
    def fill_orders(test_date, orders_df, cutoff_df, deliverydates_df):
     # Get a flat file of cutoff dates
     cutoffs_series = cutoff_df.set_index('State').stack()
    
     # Get next date after test_date
     next_cutoff = cutoffs_series[cutoffs_series > test_date].groupby(by='State').first()
     next_cutoff.name='nextcutoff'
    
     # Get flat delivery dates
     flat_delivery_dates = deliverydates_df.set_index('State').stack().to_frame('deliverydate')
    
     # Join next cutoff date
     joined = flat_delivery_dates.join(next_cutoff)
    
     # Get next delivery date after next cutoff
     next_delivery = joined.loc[joined['nextcutoff'] <= joined['deliverydate'], :].groupby(by=['State']).first()['deliverydate']
    
     # Join to orders
     return orders_df.merge(next_delivery, left_on='State', right_index=True)
    
    fill_orders(today, orders, cutoff, deliverydates)
     
    

    【讨论】:

    • 我认为这已经接近了 - 但是如果我今天运行它,它会给我的交货日期比我需要的晚一个月。我认为在 next_delivery 阶段出现了问题
    • 我刚刚运行它,所有交货日期都在 2 月,这应该是正确的,因为 1 月 19 日(今天)是 1 月的所有截止日期之后?除非你期待不同的行为?
    猜你喜欢
    • 2018-02-16
    • 2023-04-02
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多