【问题标题】:How to add positive and negative increments to every row based on a specific date?如何根据特定日期为每一行添加正负增量?
【发布时间】:2021-10-09 23:05:50
【问题描述】:

我有一个 pandas df,它有 2 列,例如 Date, First_Date (constant)

我正在尝试添加一个新列,其中 First_Date=Date 的值为 0。然后,该实例下方的所有行都应该以负数方式递增,例如 -1、-2、-3 等。上面的行也应该以正数方式递增,例如 1、2、3、4 等. 概念可视化请见附件。

我不确定是否有 pandas 函数可以执行此操作,或者在这种情况下是否有更好的函数。任何指导都会很棒。

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    >>> df = pd.DataFrame({'Date':pd.date_range('2020-01-01', '2020-01-18')})
    >>> df
             Date
    0  2020-01-01
    1  2020-01-02
    2  2020-01-03
    3  2020-01-04
    4  2020-01-05
    5  2020-01-06
    6  2020-01-07
    7  2020-01-08
    8  2020-01-09
    9  2020-01-10
    10 2020-01-11
    11 2020-01-12
    12 2020-01-13
    13 2020-01-14
    14 2020-01-15
    15 2020-01-16
    16 2020-01-17
    17 2020-01-18
    

    签出 pandas Timestamps 字符串到 DateTime 等。没有理由使用字符串和整数。

    >>> df['index'] = df - pd.Timestamp('2020-01-11')
    >>> df
             Date    index
    0  2020-01-01 -10 days
    1  2020-01-02  -9 days
    2  2020-01-03  -8 days
    3  2020-01-04  -7 days
    4  2020-01-05  -6 days
    5  2020-01-06  -5 days
    6  2020-01-07  -4 days
    7  2020-01-08  -3 days
    8  2020-01-09  -2 days
    9  2020-01-10  -1 days
    10 2020-01-11   0 days
    11 2020-01-12   1 days
    12 2020-01-13   2 days
    13 2020-01-14   3 days
    14 2020-01-15   4 days
    15 2020-01-16   5 days
    16 2020-01-17   6 days
    17 2020-01-18   7 days
    

    之后您可以通过以下方式获得所需的整数:

    >>> df['index'].transform(lambda x: x.days)
    0    -10
    1     -9
    2     -8
    3     -7
    4     -6
    5     -5
    6     -4
    7     -3
    8     -2
    9     -1
    10     0
    11     1
    12     2
    13     3
    14     4
    15     5
    16     6
    17     7
    

    编辑

    要更具体地回答,因为您有字符串日期,您必须先执行以下操作

    df[['Date', 'First_Date']] = df[['Date', 'First_Date']].astype('datetime64[ns]')
    

    然后你可以减去列并得到你的结果:

    df['index'] = df['Date'] - df['First_Date']
    

    【讨论】:

    【解决方案2】:
    import datetime
    
    dates=['2020-01-01','2020-01-02',...] #list of strings
    constant='2020-01-11'
    const=datetime.datetime.strptime(constant,'%Y-%m-%d')
    lista=[(x,constant,(datetime.datetime.strptime(x,'%Y-%m-%d')-const).days) 
    for x in dates] #lista is a list of tuples [(date,constant,days)..]
    

    希望它有效!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多