【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        相关资源
        最近更新 更多