Python 从今天减去数据帧值';日期

Python 从今天减去数据帧值';日期,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据帧: Name A B C D1 1 3 3 D2 2 4 4 D3 2 1 1 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 2

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

Name  A    B    C
D1    1    3    3
D2    2    4    4
D3    2    1    1
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
如何创建一个大小相同的新数据框,其中每个值都是今天的日期减去第一个数据框的值

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

Name  A    B    C
D1    1    3    3
D2    2    4    4
D3    2    1    1
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中遇到了各种类型的错误和问题

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

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

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

结果:

>>> 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

美好的如果你想避免导入
datetime
,你也可以使用这个lambda:
lambda x:pd.to_datetime('today')-pd.to_timedelta(str(x)+'d')
@sacul最好不要使用applymap,我担心速度:-(