【问题标题】:Add a column value depending on a date range (if-else)根据日期范围添加列值(if-else)
【发布时间】:2018-11-30 08:06:57
【问题描述】:

我的数据框中有一个日期列,并想添加一个名为位置的列。每行中的位置值应取决于它所在的日期范围。

例如,11 月 13 日的日期介于 11 月 12 日和 11 月 16 日之间,因此位置应该是西雅图。 11 月 17 日的日期介于 11 月 17 日和 11 月 18 日之间,必须是纽约。

下面是我要实现的数据框示例

Dates     | Location (column I want to add)
.............................................
11/12/2017| Seattle
11/13/2017| Seattle
11/14/2017| Seattle
11/15/2017| Seattle
11/16/2017| Seattle
11/17/2017| New York
11/18/2017| New York
11/19/2017| London
11/20/2017| London

【问题讨论】:

    标签: python pandas date dataframe


    【解决方案1】:

    首先创建包含开始日期和结束日期的位置字典,然后按字典循环并按locbetween 设置值:

    d = {'Seattle':['2017-11-12','2017-11-16'],
         'New York':['2017-11-17','2017-11-18'],
         'London':['2017-11-19','2017-11-20']}
    
    df['Dates'] = pd.to_datetime(df['Dates'], format='%m/%d/%Y')
    
    for k, (s,e) in d.items():
        df.loc[df['Dates'].between(s,e), 'Loc'] = k
    
    print (df)
           Dates  Location       Loc
    0 2017-11-12   Seattle   Seattle
    1 2017-11-13   Seattle   Seattle
    2 2017-11-14   Seattle   Seattle
    3 2017-11-15   Seattle   Seattle
    4 2017-11-16   Seattle   Seattle
    5 2017-11-17  New York  New York
    6 2017-11-18  New York  New York
    7 2017-11-19    London    London
    8 2017-11-20    London    London
    

    编辑:

    d = {'Seattle':[('2017-11-12','2017-11-13'), ('2017-11-15','2017-11-16')],
         'New York':[('2017-11-17','2017-11-18')],
         'London':[('2017-11-19','2017-11-20'), ('2017-11-14','2017-11-14')]}
    
    df['Dates'] = pd.to_datetime(df['Dates'], format='%m/%d/%Y')
    
    for k, v in d.items():
        for s, e in v:
            df.loc[df['Dates'].between(s,e), 'Loc'] = k
    
    print (df)
           Dates  Location       Loc
    0 2017-11-12   Seattle   Seattle
    1 2017-11-13   Seattle   Seattle
    2 2017-11-14   Seattle    London
    3 2017-11-15   Seattle   Seattle
    4 2017-11-16   Seattle   Seattle
    5 2017-11-17  New York  New York
    6 2017-11-18  New York  New York
    7 2017-11-19    London    London
    8 2017-11-20    London    London
    

    【讨论】:

    • 您好 Jezrael,感谢您的回复。目前,似乎每个位置只能有一个日期范围。如果每个位置有多个日期范围会怎样?
    • @zosh - 添加了另一个结构 - 带有列表和元组的字典,这里可以为每个位置定义多个范围。
    • 如果我可以在商店给你买星巴克咖啡,请告诉我
    • @zosh - 谢谢 :) 但我不喝咖啡 :)
    猜你喜欢
    • 1970-01-01
    • 2017-02-06
    • 2016-11-25
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多