【问题标题】:Add days to date conditionally using Pandas使用 Pandas 有条件地添加日期
【发布时间】:2021-07-28 14:23:59
【问题描述】:

我有一张表,我需要在其中添加天数并使用该信息创建一个新列。我遇到的问题是有两个基于不同列的日期计算。这是一张与我正在使用的表格类似的表格:

Type    Name    Date
A       Abe     6/2/2021
B       Joe     6/15/2021
A       Jin     6/25/2021
A       Jen     6/1/2021
B       Pan     6/21/2021
B       Pin     6/22/2021
B       Hon     6/11/2021
A       Hen     6/23/2021
A       Bin     6/23/2021
A       Ban     6/5/2021

我试图让表格返回这样,其中 A 型上升 7 天,B 型上升 2 个工作日:

Type    Name    Date        NewDate
A       Abe     6/2/2021    6/9/2021
B       Joe     6/15/2021   6/19/2021
A       Jin     6/25/2021   7/2/2021
A       Jen     6/1/2021    6/8/2021
B       Pan     6/21/2021   6/23/2021
B       Pin     6/22/2021   6/26/2021
B       Hon     6/11/2021   6/13/2021
A       Hen     6/23/2021   6/30/2021
A       Bin     6/23/2021   6/30/2021
A       Ban     6/5/2021    6/12/2021

到目前为止,我已经尝试过这些:

import pandas as pd
from pandas.tseries.offsets import BDay
from datetime import datetime, timedelta
df1['NewDate'] = df1.apply(df1['Date'] + timedelta(days=7) 
                 if x=='Emergency' else df1['Date'] + BDay(2) for x in df1['Type'])

不要运行它,否则你会陷入无限循环,或者会花费很长时间。

我也运行过这个:

df1['NewDate'] = [df1['Date'] + timedelta(days=7) if i=='Emergency' else df1['Date'] + BDay(2)
                 for i in df1.Type] (also tried with df1[Type] same results.

这会将所有行放在一行中(几乎看起来像它在 jupyter notebook 上返回的方式...)

我也试过这个:

df1['NewDate'] = df1['Type'].apply(lambda x: df1['Date'] + timedelta(days=7) if x=='Emergency'
                                   else df1['Date'] + BDay(2))

当我运行它时,它将遍历类型的每一行,并在 7 天前计算紧急情况时应用正确的逻辑,如果不按工作日计算,问题是返回的每一行都是在第一行计算的整个表格的行。

此时我有点迷茫,任何帮助将不胜感激。为简单起见,它可以在加上 timedelta(7) 和加上 timedelta(2) 处计算。另外,如果我必须添加更多条件,例如在名称列上说,会发生什么变化。

【问题讨论】:

    标签: python pandas datetime conditional-formatting


    【解决方案1】:

    要使用apply,请尝试:

    df["Date"] = pd.to_datetime(df["Date"])
    df["NewDate"] = df.apply(lambda x: x["Date"]+BDay(2) if x["Type"]=="B" else x["Date"]+pd.DateOffset(days=7), axis=1)
    
    >>> df
      Type Name       Date    NewDate
    0    A  Abe 2021-06-02 2021-06-09
    1    B  Joe 2021-06-15 2021-06-17
    2    A  Jin 2021-06-25 2021-07-02
    3    A  Jen 2021-06-01 2021-06-08
    4    B  Pan 2021-06-21 2021-06-23
    5    B  Pin 2021-06-22 2021-06-24
    6    B  Hon 2021-06-11 2021-06-15
    7    A  Hen 2021-06-23 2021-06-30
    8    A  Bin 2021-06-23 2021-06-30
    9    A  Ban 2021-06-05 2021-06-12
    

    或者,您可以使用numpy.where

    import numpy as np
    df["NewDate"] = np.where(df["Type"]=="B", df["Date"]+BDay(2), df["Date"]+pd.DateOffset(7))
    

    【讨论】:

    • 效果很好。因此,如果我想添加另一个条件,那么我只需编写 [link]'df["NewDate"] = df.apply(lambda x: x["Date"]+BDay(2) if x["Type"]= ="B" & x["Name"]=="其他条件" else x["Date"]+pd.DateOffset(days=7), axis=1)' 或 us |为或?
    • 是的,根据需要使用括号 ()df["NewDate"] = df.apply(lambda x: x["Date"]+BDay(2) if (x["Type"]=="B") & (x["Name"]=="other condition") else x["Date"]+pd.DateOffset(days=7), axis=1)
    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 2018-05-12
    • 2021-10-19
    • 1970-01-01
    • 2019-03-17
    • 2016-12-09
    • 2021-07-28
    • 2021-05-28
    相关资源
    最近更新 更多