【问题标题】:Subtracting pandas Dataframe values from today's date从今天的日期中减去 pandas Dataframe 值
【发布时间】:2018-04-27 17:52:30
【问题描述】:

我有一个如下所示的数据框:

Name  A    B    C
D1    1    3    3
D2    2    4    4
D3    2    1    1

如何创建一个大小相同的新数据框,其中每个值都是今天的日期减去我的第一个数据框的值?

例如,如果今天是 2018-04-27,我的新数据框将如下所示:

Name  A             B             C  
D1    2018-04-26    2018-04-24    2018-04-24
D2    2018-04-25    2018-04-23    2018-04-23
D3    2018-04-25    2018-04-26    2018-04-26

我认为解决方案将包括类似

df2.iloc[1,1] = datetime.today() - timedelta(days=df1[1,1])

但我在循环原始 df 时遇到了各种类型错误和问题

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    import datetime as dt
    from datetime import timedelta
    import pandas as pd
    
    df = pd.DataFrame({'Name':['D1','D2','D3'],'A':[1,2,2],'B':[3,4,1],'C':[3,4,1]})
    df.set_index('Name', inplace=True)
    df2 = df.applymap(lambda x: dt.date.today() - timedelta(days = x))
    
    df2 
                       A           B           C
        Name
        D1    2018-04-26  2018-04-24  2018-04-24
        D2    2018-04-25  2018-04-23  2018-04-23
        D3    2018-04-25  2018-04-26  2018-04-26
    

    Applymap 是您要使用的内容

    编辑:添加导入以避免日期时间导入问题,如 here 所示

    【讨论】:

    • 不错!如果要避免导入datetime,也可以使用这个lambda:lambda x: pd.to_datetime('today') - pd.to_timedelta(str(x)+'d'))
    • @sacul 最好不要使用 applymap ,我担心速度:-(
    【解决方案2】:

    最好不要使用applymap

    df.set_index('Name', inplace=True)
    
    pd.to_datetime('today').date()-df.apply(pd.to_timedelta,unit='d')
    Out[428]: 
                   A           B           C
    Name                                    
    D1    2018-04-26  2018-04-24  2018-04-24
    D2    2018-04-25  2018-04-23  2018-04-23
    D3    2018-04-25  2018-04-26  2018-04-26
    

    【讨论】:

      【解决方案3】:

      您可以展平 DataFrame 的值,以便将它们传递给 pd.to_timedelta()。这使您无需使用.applymap().apply()

      today = pd.to_datetime(dt.date(2018, 4, 27))
      deltas = pd.to_timedelta(df.values.flatten(), unit='d')
      df2 = pd.DataFrame(np.reshape((today - deltas).values, df2.shape),
                         index=df.index, columns=df.columns)
      

      结果:

      >>> df2
                    A          B          C
      Name                                 
      D1   2018-04-26 2018-04-24 2018-04-24
      D2   2018-04-25 2018-04-23 2018-04-23
      D3   2018-04-25 2018-04-26 2018-04-26
      
      >>> df2.dtypes
      A    datetime64[ns]
      B    datetime64[ns]
      C    datetime64[ns]
      dtype: object
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        相关资源
        最近更新 更多