#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
и т.д.