繁体   English   中英

日期时间计算中的新 pandas DataFrame 列

[英]New pandas DataFrame column from datetime calculation

我正在尝试计算自营销活动启动以来已经过去的天数。 我的 DataFrame (df) 中每个营销活动的每个日期都有一行,所有日期都从同一天开始(尽管每个活动的每一天都没有数据点)。 在“b”列中,我有与感兴趣的数据点相关的日期 (dateime64[ns]),在“c”列中,我有营销活动的启动日期 (dateime64[ns])。 当“b”列早于“c”列时,我希望结果计算返回 n/a(或 np.NaN 或合适的替代方案),否则我希望计算返回两个日期的差值。

活动 日期 发射日期 所需列
一种 2019-09-01 2022-12-01 不适用
一种 2019-09-02 2022-12-01 不适用
2019-09-01 2019-09-01 0
2019-09-25 2019-09-01 24

当我尝试时:

df['Days Since Launch'] = df['Date'] - df['Launch Date']

我希望返回一个负值实际上返回一个正值,因此当我的日期是发布日期前 10 天和发布日期后 10 天时会导致重复值。

当我尝试时:

df['Days Since Launch'] = np.where(df['Date'] < df['Launch Date'], XXX, df['Date'] - df['Launch Date'])

其中 XXX 必须与两个输入列的数据类型相同,所以我不能输入 np.NaN 因为计算会失败,我也不能输入日期,因为这仍然会留下我想要解决的相同问题。 IF 语句不起作用,因为“系列的真值不明确”。 有任何想法吗?

您可以使用dt.days直接减法并转换为天数,然后使用where屏蔽负值:

s = pd.to_datetime(df['Date']).sub(pd.to_datetime(df['Launch Date'])).dt.days
# or, if already datetime:
#s = df['Date'].sub(df['Launch Date']).dt.days

df['Desired Column'] = s.where(s.ge(0))

更接近您最初尝试的替代方法,使用mask

df['Desired Column'] = (df['Date'].sub(df['Launch Date'])
                         .mask(df['Date'] < df['Launch Date'])
                       )

Output:

  Campaign        Date Launch Date  Desired Column
0        A  2019-09-01  2022-12-01             NaN
1        A  2019-09-02  2022-12-01             NaN
2        B  2019-09-01  2019-09-01             0.0
3        B  2019-09-25  2019-09-01            24.0

添加Series.dt.days以将时间增量转换为天数:

df['Days Since Launch'] = np.where(df['Date'] < df['Launch Date'], 
                                   np.nan, 
                                   (df['Date'] - df['Launch Date']).dt.days)

print (df)

  Campaign       Date Launch Date  Desired Column  Days Since Launch
0        A 2019-09-01  2022-12-01             NaN                NaN
1        A 2019-09-02  2022-12-01             NaN                NaN
2        B 2019-09-01  2019-09-01             0.0                0.0
3        B 2019-09-25  2019-09-01            24.0               24.0

另一种选择:

df["Date"] = pd.to_datetime(df["Date"])
df["Launch Date"] = pd.to_datetime(df["Launch Date"])
df["Desired Column"] = df.apply(lambda x: x["Date"] - x["Launch Date"] if x["Date"] >= x["Launch Date"] else None, axis=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM