Как рассчитать возраст на основе даты рождения, проблемы с меткой времени и временем в панд Python?

#python #pandas #date #datetime #timestamp

Вопрос:

У меня есть фрейм данных в Панд Python, как показано ниже:

 col_date
-------
2001-01-05
1992-05-06
 

И я хочу использовать функцию ниже для вычисления возраста на основе приведенного выше столбца во фрейме данных:

 def age(born):
    """
    Desc.
    """
    born = datetime.strptime(born, '%y%m%d').date()
    date = "2021-08-01"
    return date.year - born.year - ((date.month, date.day) < (born.month, born.day))
 

Когда я проверяю значения, у df.col_date.unique() меня есть результаты, как показано ниже:

 array([datetime.date(2001, 1, 5), datetime.date(1992, 5, 6),dtype=object)
 

И когда я использую свою функцию: df["col_date"] = df["col_date"].apply(age)
У меня есть ошибка: TypeError: strptime() argument 1 must be str, not datetime.date

Но когда я меняю тип со строки на дату и время и использую функцию, у меня возникает ошибка: TypeError: strptime() argument 1 must be str, not Timestamp потому что вместо даты и времени у меня есть метка времени: '2001-01-05T00:00:00.000000000'

Что я могу сделать, я совершенно не знаю?

Ответ №1:

Вы можете попробовать через pd.to_datetime() :

 def age(born):
    """
    Desc.
    """
    born = pd.to_datetime(born,format='%Y-%m-%d')
    date = pd.to_datetime("2021-08-01")
    return date.year - born.year - (date.month<born.month and date.day<born.day)

#Finallly:
df["col_date"] = df["col_date"].apply(age)
 

или

другой способ-напрямую оценить свое состояние:

 df['col_date']=pd.to_datetime(df['col_date'])
date = pd.to_datetime("2021-08-01")
df['col_date']=(date.year-df['col_date'].dt.year)-((df['col_date'].dt.month.lt(date.month)) amp; (df['col_date'].dt.day.lt(date.day)))
 

Ответ №2:

Используйте модуль dateutil :

 from dateutil import relativedelta

def age(born: datetime.date):
    return relativedelta.relativedelta(datetime.date.today(),born)
 

Для datetime.date представления 2001-01-05 это вернется

 relativedelta(years= 20, months= 7, days= 7)
 

и вы можете перевести это так, как вам нравится

 >>> result = age(datetime.date(2001,1,5))
>>> result.years
20
>>> result.months
7
 

и т.д.