我正在尝试使用Python3计算平均年龄(年+月格式)。我加载了一个excel文件,并在下面编写了代码:
import datetime
from datetime import date, timedelta
import pandas as pd
from pandas import ExcelFile
today = date.today()
agefile = pd.read_excel("test.xlsx", sheet_name = "birthdate")
age = pd.to_datetime(agefile["birthdate"], format = "%d/%m/%Y")
average_age = sum(((today - x) for x in age), timedelta(0)) / len(age)
最后一行无效。它给了我这样的错误消息:
descriptor '__sub__' requires a 'datetime.datetime' object but received a 'datetime.date'
我花了大量时间弄清楚问题出在哪里,但是到目前为止,我还没有找到相关的答案。您能帮我解决这个问题吗?
答案 0 :(得分:1)
date.today()
是date
,而x
中的age
都是datetime
。将date.today()
更改为datetime.today()
,错误应消失。
答案 1 :(得分:0)
对于Pandas,您应该致力于使用矢量化计算,而不是转换为常规的Python datetime
对象。在内部,Pandas pd.Timestamp
对象用整数表示,因此可以进行高效的计算。
因此,您可以执行以下操作:
# create series of dates containing birthdates
birthdate = pd.to_datetime(agefile['birthdate'], format='%d/%m/%Y')
# subtract from today's date
age = pd.to_datetime('today') - birthdate
# calculate average age
avg_age = age.mean()
这是一个最小的例子:
s = pd.Series(['2010-01-01', '2011-11-30'])
res = (pd.to_datetime('today') - pd.to_datetime(s)).mean()
# Timedelta('2815 days 23:39:13.331568')