[英]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.