从日期时间计算新增PandasDataFrame数据行

w80xi6nr  于 2022-12-09  发布在  其他
关注(0)|答案(3)|浏览(146)

我正在尝试计算市场营销活动启动后经过的天数。在DataFrame中,每个市场营销活动的每个日期对应一行(df)并且所有日期都从同一天开始(虽然没有每个活动每天的数据点)。在列“B”中,我有与感兴趣的数据点相关的日期(dateime 64 [ns]),而在列“c”中,我有市场活动的启动日期(dateime 64 [ns])。当列“b”早于列“c”时,我希望结果计算返回n/a(或np.NaN或合适的替代项),否则我希望计算返回两个日期的差值。
| 活动|日期|上市日期|所需列|
| - -|- -|- -|- -|
| A级|2019年9月1日|2022年12月1日|不适用|
| A级|2019年9月2日|2022年12月1日|不适用|
| B| 2019年9月1日|2019年9月1日|第0页|
| B| 2019年9月25日|2019年9月1日|二十四|
当我尝试:

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语句不起作用,因为“序列的真值是模糊的”。有什么想法吗?

ghg1uchk

ghg1uchk1#

您可以使用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'])
                       )

输出量:

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
lb3vh1jj

lb3vh1jj2#

添加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
des4xlb0

des4xlb03#

另一种选择:

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)

相关问题