Вычитание значений Dataframe для панд из сегодняшней даты - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть датафрейм, который выглядит так:

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

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Лучше не использовать 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
0 голосов
/ 16 июля 2018

Вы можете сгладить значения 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
0 голосов
/ 27 апреля 2018
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 - это то, что вы хотите использовать

Редактировать: добавление импорта, чтобы избежать проблем с импортом даты и времени, как видно здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...