【问题标题】:find next working day in a pandas column在 pandas 列中查找下一个工作日
【发布时间】:2016-04-20 21:41:07
【问题描述】:

我有一个代表商店营业日的 pandas df,如下所示:

         Dates  Open
0   2016-01-01     0
1   2016-01-02     0
2   2016-01-03     0
3   2016-01-04     1
4   2016-01-05     1
5   2016-01-06     1
6   2016-01-07     1
7   2016-01-08     1
8   2016-01-09     0
9   2016-01-10     0
10  2016-01-11     1
11  2016-01-12     1
12  2016-01-13     1
13  2016-01-14     1
14  2016-01-15     1
15  2016-01-16     0
16  2016-01-17     0
17  2016-01-18     1
18  2016-01-19     1
19  2016-01-20     1
20  2016-01-21     1
21  2016-01-22     1
22  2016-01-23     0
23  2016-01-24     0
24  2016-01-25     1
25  2016-01-26     1
26  2016-01-27     1
27  2016-01-28     1
28  2016-01-29     1

这可以通过以下方式重新创建:

Dates =['2016-01-01',
 '2016-01-02',
 '2016-01-03',
 '2016-01-04',
 '2016-01-05',
 '2016-01-06',
 '2016-01-07',
 '2016-01-08',
 '2016-01-09',
 '2016-01-10',
 '2016-01-11',
 '2016-01-12',
 '2016-01-13',
 '2016-01-14',
 '2016-01-15',
 '2016-01-16',
 '2016-01-17',
 '2016-01-18',
 '2016-01-19',
 '2016-01-20',
 '2016-01-21',
 '2016-01-22',
 '2016-01-23',
 '2016-01-24',
 '2016-01-25',
 '2016-01-26',
 '2016-01-27',
 '2016-01-28',
 '2016-01-29']

Open = [0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1]


df = DataFrame({'Dates':Dates, 'Open':Open})

open 列表示商店开放送货的天数。我想为最左侧列中的每个日期创建一个新列,其中包含下一个开放日。我不能使用预定义的工作日功能,但我必须使用 Open 列来确定商店是否营业。期望的结果是:

         Dates  Open     Desired
0   2016-01-01     0  2016-01-04
1   2016-01-02     0  2016-01-04
2   2016-01-03     0  2016-01-04
3   2016-01-04     1  2016-01-05
4   2016-01-05     1  2016-01-06
5   2016-01-06     1  2016-01-07
6   2016-01-07     1  2016-01-08
7   2016-01-08     1  2016-01-11
8   2016-01-09     0  2016-01-11
9   2016-01-10     0  2016-01-11
10  2016-01-11     1  2016-01-12
11  2016-01-12     1  2016-01-13
12  2016-01-13     1  2016-01-14
13  2016-01-14     1  2016-01-15
14  2016-01-15     1  2016-01-18
15  2016-01-16     0  2016-01-18
16  2016-01-17     0  2016-01-18
17  2016-01-18     1  2016-01-19
18  2016-01-19     1  2016-01-20
19  2016-01-20     1  2016-01-21
20  2016-01-21     1  2016-01-22
21  2016-01-22     1  2016-01-25
22  2016-01-23     0  2016-01-25
23  2016-01-24     0  2016-01-25
24  2016-01-25     1  2016-01-26
25  2016-01-26     1  2016-01-27
26  2016-01-27     1  2016-01-28
27  2016-01-28     1  2016-01-29
28  2016-01-29     1  

【问题讨论】:

    标签: python date pandas


    【解决方案1】:

    IIUC 然后您可以在使用to_datetime 将字符串转换为日期时间dtype 后添加Business Day offset

    In [141]:
    df['Dates'] = pd.to_datetime(df['Dates'])
    df.info()
    
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 29 entries, 0 to 28
    Data columns (total 2 columns):
    Dates    29 non-null datetime64[ns]
    Open     29 non-null int64
    dtypes: datetime64[ns](1), int64(1)
    memory usage: 696.0 bytes
    
    In [146]:
    from pandas.tseries.offsets import *
    df['Desired'] = df['Dates'] + BDay()
    df
    
    Out[146]:
            Dates  Open    Desired
    0  2016-01-01     0 2016-01-04
    1  2016-01-02     0 2016-01-04
    2  2016-01-03     0 2016-01-04
    3  2016-01-04     1 2016-01-05
    4  2016-01-05     1 2016-01-06
    5  2016-01-06     1 2016-01-07
    6  2016-01-07     1 2016-01-08
    7  2016-01-08     1 2016-01-11
    8  2016-01-09     0 2016-01-11
    9  2016-01-10     0 2016-01-11
    10 2016-01-11     1 2016-01-12
    11 2016-01-12     1 2016-01-13
    12 2016-01-13     1 2016-01-14
    13 2016-01-14     1 2016-01-15
    14 2016-01-15     1 2016-01-18
    15 2016-01-16     0 2016-01-18
    16 2016-01-17     0 2016-01-18
    17 2016-01-18     1 2016-01-19
    18 2016-01-19     1 2016-01-20
    19 2016-01-20     1 2016-01-21
    20 2016-01-21     1 2016-01-22
    21 2016-01-22     1 2016-01-25
    22 2016-01-23     0 2016-01-25
    23 2016-01-24     0 2016-01-25
    24 2016-01-25     1 2016-01-26
    25 2016-01-26     1 2016-01-27
    26 2016-01-27     1 2016-01-28
    27 2016-01-28     1 2016-01-29
    28 2016-01-29     1 2016-02-01
    

    【讨论】:

    • 感谢您的回答。但是,正如我所指定的,我不能使用预定义的工作日功能。这只是一个示例,商店可能关闭/开放的日期可能会有所不同
    • 您可以为此使用custom business days
    • 这是否符合您的要求:holidays = df.loc[df['Open'] == 0, 'Dates'] df['Dates'] + BDay(holidays = holidays)?
    • 我发现错误:“TypeError: cannot concatenate 'str' and 'BusinessDay'”“第二行的对象
    • 您仍然需要先将“日期”列转换为日期时间,您这样做了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2021-09-09
    • 2019-05-30
    • 2016-09-23
    • 2013-08-01
    • 2021-12-27
    相关资源
    最近更新 更多