Как рассчитать количество лет между двумя датами в разных столбцах панд - PullRequest
0 голосов
/ 12 июня 2018

В одном столбце есть даты, но в другом есть строка, содержащая дату, поэтому сначала мне нужно извлечь часть даты из этой строки.

import pandas as pd
import datetime
from dateutil.relativedelta import relativedelta

# the dataframe - id column always starts with year, month and day
df = pd.DataFrame({'id': ['19520630F8', '19680321A5', '19711113E2'],
                   'dte': ['2010-06-02', '2007-08-12', '2013-01-23']})

# create a date string from df['id'] to the format yyyy-mm-dd
dob = (df['id'].str[:4] + '-' +
       df['id'].str[4:6] + '-' +
       df['id'].str[6:8])

# calculate age (years only) at df['dte']
df['age'] = relativedelta(date, dob).years

Я получаю сообщение об ошибке:

ValueError: Значение истинности Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Я не понимаю двусмысленности моих данных, игде применять эти пустые / bool / item ... Столбец df['dta'], если тип данных объекта, а не дата и время, но перенос создания dob в pd.to_datetime не поможет.

EDIT Ожидаемый результат долженбыть

          dte          id  age
0  2010-06-02  19520630F8   57
1  2007-08-12  19680321A5   39
2  2013-01-23  19711113E2   41

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вот одно решение, использующее dateutil.relativedelta и понимание списка.Важно убедиться, что у вас есть две серии datetime, прежде чем использовать их в вычислениях.

df['id_dte'] = pd.to_datetime(df['id'].str[:8], format='%Y%m%d')
df['dte'] = pd.to_datetime(df['dte'])

df['age'] = [relativedelta(a, b).years for a, b in zip(df['dte'], df['id_dte'])]

print(df)

         dte          id     id_dte  age
0 2010-06-02  19520630F8 1952-06-30   57
1 2007-08-12  19680321A5 1968-03-21   39
2 2013-01-23  19711113E2 1971-11-13   41

Если, однако, вы просто хотите взять разницу между годами ( не выводится из возраста), вы можете просто использовать datetime атрибуты напрямую:

df['age'] = df['dte'].dt.year - df['id_dte'].dt.year

print(df)

         dte          id     id_dte  age
0 2010-06-02  19520630F8 1952-06-30   58
1 2007-08-12  19680321A5 1968-03-21   39
2 2013-01-23  19711113E2 1971-11-13   42
0 голосов
/ 12 июня 2018

Я считаю, что необходимо:

df['age'] = (np.floor((pd.to_datetime(df['dte']) - 
             pd.to_datetime(dob)).dt.days / 365.25)).astype(int)
print (df)
           id         dte  age
0  19520630F8  2010-06-02   57
1  19680321A5  2007-08-12   39
2  19711113E2  2013-01-23   41

Подробности :

Преобразование столбцов в дату и вычитание:

print (pd.to_datetime(df['dte']) -  pd.to_datetime(dob))
0   21156 days
1   14388 days
2   15047 days
dtype: timedelta64[ns]

Преобразование в дни изатем в годах:

print ((pd.to_datetime(df['dte']) -  pd.to_datetime(dob)).dt.days / 365.25)
0    57.921971
1    39.392197
2    41.196441
dtype: float64

Последние floor значения по numpy.floor.:

print ((np.floor((pd.to_datetime(df['dte']) - pd.to_datetime(dob)).dt.days / 365.25)))
0    57.0
1    39.0
2    41.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...