Python панды: как создать столбец с фиксированной датой + количество дней в другом столбце - PullRequest
2 голосов
/ 05 марта 2019

Мне нужно добавить столбец в фрейм данных, чтобы строка 0 была 15 февраля 2019 года. 1-й ряд - 16-й и т. д. Я пытался использовать индекс:

import numpy as np
import pandas as pd
df=pd.DataFrame()
df['a']=np.arange(10,20)
df['date from index']=df.apply( lambda x: pd.to_datetime('15-2-2019') + pd.DateOffset(days=x.index), axis=1 )

но я получаю:

TypeError: ('должно быть str, а не int', 'произошло с индексом 0')

что я признаю, я не понимаю. Я попытался создать явный столбец для использования вместо индекса:

df=pd.DataFrame()
df['a']=np.arange(10,20)
df['counter']=np.arange(0,df.shape[0])
df['date from counter']=df.apply( lambda x: pd.to_datetime('15-2-2019') + pd.DateOffset(days=x['counter']), axis=1 )

но это дает мне:

TypeError: ('неподдерживаемый тип для компонента timedelta days: numpy.int32 ',' произошло с индексом 0 ')

Есть идеи, что я делаю не так? Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 марта 2019

Используйте to_timedelta для преобразования значений в дневные временные интервалы или использования параметр origin с указанием начального дня с параметром unit в to_datetime:

df['date from index']= pd.to_datetime('15-2-2019') + pd.to_timedelta(df.index, 'd')
df['date from counter']= pd.to_datetime('15-2-2019') + pd.to_timedelta(df['counter'], 'd')

df['date from index1']= pd.to_datetime(df.index, origin='15-02-2019', unit='d')
df['date from counter1']= pd.to_datetime(df['counter'], origin='15-02-2019', unit='d')
print(df.head())
    a  counter date from index date from counter date from index1  \
0  10        0      2019-02-15        2019-02-15       2019-02-15   
1  11        1      2019-02-16        2019-02-16       2019-02-16   
2  12        2      2019-02-17        2019-02-17       2019-02-17   
3  13        3      2019-02-18        2019-02-18       2019-02-18   
4  14        4      2019-02-19        2019-02-19       2019-02-19   

  date from counter1  
0         2019-02-15  
1         2019-02-16  
2         2019-02-17  
3         2019-02-18  
4         2019-02-19  
2 голосов
/ 05 марта 2019

Вы можете векторизовать это с помощью pd.to_timedelta:

# pd.to_timedelta(df.index, unit='d') + pd.to_datetime('15-2-2019') # whichever
pd.to_timedelta(df.a, unit='d') + pd.to_datetime('15-2-2019')

0   2019-02-25
1   2019-02-26
2   2019-02-27
3   2019-02-28
4   2019-03-01
5   2019-03-02
6   2019-03-03
7   2019-03-04
8   2019-03-05
9   2019-03-06
Name: a, dtype: datetime64[ns]

df['date_from_counter'] = (
    pd.to_timedelta(df.a, unit='d') + pd.to_datetime('15-2-2019'))
df

    a  counter date_from_counter
0  10        0        2019-02-25
1  11        1        2019-02-26
2  12        2        2019-02-27
3  13        3        2019-02-28
4  14        4        2019-03-01
5  15        5        2019-03-02
6  16        6        2019-03-03
7  17        7        2019-03-04
8  18        8        2019-03-05
9  19        9        2019-03-06

Как и ожидалось, вы можете вызвать pd.to_timedelta для любого столбца целых чисел с нужной единицей, а затем использовать результирующий столбец Timedelta для арифметики даты и времени.


Чтобы ваш код работал, похоже, вам нужно было передать int, а не np.int (не знаю почему). Это работает.

dt = pd.to_datetime('15-2-2019')
df['date from counter'] = df.apply(
    lambda x: dt + pd.DateOffset(days=x['counter'].item()), axis=1)
df

    a  counter date from counter
0  10        0        2019-02-15
1  11        1        2019-02-16
2  12        2        2019-02-17
3  13        3        2019-02-18
4  14        4        2019-02-19
5  15        5        2019-02-20
6  16        6        2019-02-21
7  17        7        2019-02-22
8  18        8        2019-02-23
9  19        9        2019-02-24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...