有时候我们需要通过日期的加减来计算年龄,以下函数呢就是一个可以简单进行年龄计算的函数啦~
from datetime import datetime
def calculate_age(start_time,end_time):
try:
if start_time != "None" and end_time != "None":
start_d = datetime.strptime(start_time, "%d-%b-%y")
end_d = datetime.strptime(end_time, "%d-%b-%y")
#因为这里用的是两位数的年份,所以要考虑到相减为负数的情况!(比如2020-1990本来应该是30岁,但是20-90结果却是-70)
#所以要先进行一个大小比较
if start_d.year > end_d.year:
if end_d.month > start_d.month:
age = 100 + (end_d.year - start_d.year)
else:
age = 100 + (end_d.year - start_d.year) - 1
else:
if end_d.month > start_d.month:
age = end_d.year - start_d.year
else:
age = end_d.year - start_d.year -1
except:
age = None
return age
默认start_time和end_time 两个日期均以字符串的形式输入,函数datetime.strptime可以把字符串按照固定的格式转换为时间类变量。其中“%d-%b-%y"对应输入字符串的简写格式。一些常用的格式如下:
- %y 两位数的年份表示(00-99)
- %a 英文星期简写
- %A 英文星期的完全
- %b 英文月份的简写
- %B 英文月份的完全
- %c 显示本地日期时间
- %d 日期,取1-31
- %H 小时, 0-23
- %I 小时, 0-12
- %m 月, 01 -12
- %M 分钟,1-59
- %j 年中当天的天数
- %w 显示今天是星期几
- %W 第几周
- %x 当天日期
- %X 本地的当天时间
- %y 年份 00-99间
- %Y 年份的完整拼写
因为我写这个函数是为了使用两列不同的日期特征生成新的一列表示年龄的特征,所以接下来就需要应用到数据集中啦:
for i in range(0,len(data)):
data.at[i,'Age'] = calculate_age(str(data.at[i,'birthDate']),str(data.at[i,'endDate']))
其中有两个小小坑:
(1)当输入 start_time 和 end_time 有空值时,是不能转换为日期的,即,当 birthDate 和 endDate 两个特征中中存在空值时,是无法计算对应的Age的。所以函数中将空值进行了一个过滤 if start_time != None and end_time != None,保证进入转换和相减的日期都是干净的。同时,加入异常处理模块,如果遇到异常,则对应的年龄赋值为零。
(2)因为我这里用的是两位数的年份,所以要考虑到相减为负数的情况。比如2020-1990本来应该是30岁,但是使用两位数年份20-90结果却是-70,所以要先进行一个大小比较,再分类进行相减。