【问题标题】:Add date in rows where date is missing based on other column根据其他列在缺少日期的行中添加日期
【发布时间】:2019-06-12 08:52:54
【问题描述】:

我有一个包含时间序列数据的数据框。在一栏中我有注册日期,而在另一栏中有取消日期。我想为缺少的取消日期添加一个日期,该日期小于特定日期,但最长为 40 周。

我应该如何进行?

如果df['cancel_date'] 是NaT,则添加最大日期。 + 40 周。 df['cancel_date'] - df['signup_date'] 不应小于 0。

【问题讨论】:

  • 您有df 的示例(有些行缺少数据)吗?
  • date.max 是什么意思?这是df['signup_date'] 或df['cancel_date'] 的最大值吗?
  • with date.max 我的意思是日期不应大于例如2018-04-30 - df['cancel_date']
  • 我还是不明白。 2018-04-30 来自哪里?您说 Chris A 的解决方案 1 有效,但这并没有使用 max 的任何内容。你真的需要max的东西吗?如果您只是使用相应行中的 signup_date 。如果再加上 40 周,怎么会小于 0?

标签: python pandas


【解决方案1】:

IIUC,您可以将Series.fillna 与pandas.Timedelta 类一起使用。

如果将记录添加 40 周 signup_date:

df['cancel_date'] = df['cancel_date'].fillna(df['signup_date'] + pd.Timedelta(40, 'W'))

如果在sign_up 列中将最大日期加上 40 周:

df['cancel_date'] = df['cancel_date'].fillna(df['signup_date'].max() + pd.Timedelta(40, 'W'))

或者,如果使用一些预定义的max date 值,具有signup_date < cancel_date 的约束,则链接clip 方法:

max_date = pd.datetime(2018, 4, 30)

df['cancel_date'] = df['cancel_date'].fillna(max_date + pd.Timedelta(40, 'W')).clip(lower=df.signup_date)

【讨论】:

    【解决方案2】:

    如果您想在开立日期和取消日期之间直接附加差异列,我会使用numpy.where:

    df['date difference between signup and cancel'] = np.where(df['cancel_date'] == np.nan, (df['signup_date'].max() + pd.Timedelta(40, 'W'))-df['signup_date'], df['cancel_date']-df['signup_date'])
    

    这将为您提供一个新列,您可以在其中直接了解注册日期和取消日期之间的差异

    【讨论】:

    • datemax 不见了,他也可以在其中应用另一个 numpy
    • 这仍然不符合他的要求。如果df['cancel_date'] 是NaN,你怎么能从中减去(df['signup_date'].max() + pd.Timedelta(40, 'W'))?而且np.where() 的y 部分也不正确。如果 df['cancel_date']` 是一个日期,那么它应该只是 df['cancel_date']` (而不是df['cancel_date']-df['signup_date'])。
    • 现在换个方式,我不确定他要什么
    • 如果他要求只是用逻辑填充,上面的解决方案是正确的,如果他需要添加另一列,我的还不错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2020-05-07
    相关资源
    最近更新 更多