【问题标题】:New pandas DataFrame column from datetime calculation来自日期时间计算的新 pandas DataFrame 列
【发布时间】:2022-12-05 23:06:21
【问题描述】:
我正在尝试计算自营销活动启动以来已经过去的天数。我的 DataFrame (df) 中的每个营销活动的每个日期都有一行,所有日期都从同一天开始(尽管每个活动的每一天都没有数据点)。在“b”列中,我有与感兴趣的数据点相关的日期 (dateime64[ns]),在“c”列中,我有营销活动的启动日期 (dateime64[ns])。当“b”列早于“c”列时,我希望结果计算返回 n/a(或 np.NaN 或合适的替代方案),否则我希望计算返回两个日期的差值。
| Campaign |
Date |
Launch Date |
Desired Column |
| A |
2019-09-01 |
2022-12-01 |
n/a |
| A |
2019-09-02 |
2022-12-01 |
n/a |
| B |
2019-09-01 |
2019-09-01 |
0 |
| B |
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 语句不起作用,因为“系列的真值不明确”。有任何想法吗?
【问题讨论】:
标签:
python
pandas
dataframe
datetime
【解决方案1】:
添加 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
【解决方案2】:
您可以使用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))
输出:
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