我目前拥有此代码,可以通过减去参考日期(当月第一天)和在线数据库中的出生日期之间的年龄。
我已经尝试更改每月第一天的获取方式,但这是唯一为我提供专栏的解决方案。当我尝试减去两列时,出现类型错误,并且我不知道如何解决。
我的数据:
dateBirth dataRef
1977-08-29 2020-05-01
1995-04-13 2020-05-01
1981-07-21 2020-05-01
我的代码:
DOB = exec_sql('SELECT TOP 100 ID_Customer,D_BirthOrCompFoundation FROM Customer WHERE D_BirthOrCompFoundation IS NOT NULL;')
DOB['dateBirth'] = DOB['D_BirthOrCompFoundation'].apply(lambda x: datetime.strptime(x,'%Y-%m-%d'))
DOB['dataRef'] = datetime.today()
DOB['dataRef'] = DOB['dataRef'].dt.strftime("%Y-%m-01")
DOB['difDatas'] = DOB['dataRef'] - DOB['dateBirth']
#DOB['age'] = round(DOB['difDatas'].dt.days/(365.25),2)
print(DOB)
我收到的错误消息:
TypeError: cannot subtract DatetimeArray from ndarray
预期输出:
dateBirth dataRef difDatas age
1977-08-29 2020-05-01 15590 days 42.xx
1995-04-13 2020-05-01 9154 days 25.xx
1981-07-21 2020-05-01 14168 days 38.xx
任何帮助将不胜感激,谢谢!
假设您正在使用pandas
,to_datetime
应该使您的生活更轻松,例如
import pandas as pd
# example df, with dates in string format:
DOB = pd.DataFrame({'dateBirth': ['1977-08-29', '1995-04-13', '1981-07-21']})
# parse dateBirth to datetime:
DOB['dateBirth'] = pd.to_datetime(DOB['dateBirth'])
# get a datetime64[ns] column with today's date:
DOB['dateRef'] = pd.to_datetime(pd.Timestamp.today().date())
DOB['difDates'] = (DOB['dateRef'] - DOB['dateBirth'])
DOB['age'] = (DOB['difDates'].dt.days / 365.25).round(2)
# DOB
# dateBirth dateRef difDates age
# 0 1977-08-29 2020-05-05 15590 days 42.68
# 1 1995-04-13 2020-05-05 9154 days 25.06
# 2 1981-07-21 2020-05-05 14168 days 38.79
重点是将所有具有日期/时间的列转换为dtype'datetime64 [ns]'的熊猫。然后算术运算就可以正常工作,例如[difDates]栏中的时间增量。