3.4 使用日期格式
把每一个数据属性转换成合适的数据类型之后,我们可以看到employees和salaries中的一些属性是日期类型的。因此,我们可以计算雇员的出生日期和当前日期之间的年份数,进而得出每个雇员的年龄。这里我们会介绍如何使用内置日期函数和lubridate程序包来操作日期格式的数据。
准备工作
按照之前的教程,把导入数据的每个属性转换成正确的数据类型。并且,你需要按照3.2节“重命名数据变量”中的步骤,命名employees和salaries数据集的列名。
实现步骤
执行下列步骤,使用employees和salaries中的日期格式数据。
1.我们可以使用下列代码,加上或者减去日期格式属性中的一些天数:
2.我们可以使用下列代码,获取hire_date和birth_date之间的时间间隔:
3.除了得到以天为单位的时间间隔,我们还可以使用函数difftime获取以周为单位的时间间隔:
4.除了内置的日期操作函数,我们还可以安装和加载lubridate程序包来操作日期:
5.然后,我们可以使用函数ymd把日期数据转换成POSIX格式:
6.接着,我们可以使用函数as.period查看hire_date和birth_date之间的时长:
7.我们也可以使用函数year获取时间间隔:
8.并且,我们可以使用函数now获取当前日期:
9.最后,我们可以使用下列代码计算每一个雇员的年龄:
运行原理
完成上一个教程之后,employees数据和salaries数据应该完成了重命名,每一个属性也应该转换成了合适的数据类型。由于一些属性是日期类型的,我们可以使用日期函数来计算属性之间的时间间隔。
日期类型的数据支持算术运算,我们可以加上或减去一些天数。因此,我们首先展示了可以给hire_date加上30天。然后我们可以检查一下受雇日期是否真的加了30天。然后,我们可以计算birth_date属性和hire_date属性之间以天为单位的时间间隔,进而找出雇员开始在公司工作时的年龄。然而,减法操作只能告诉我们天数间隔,我们需要更多计算方法,支持除天数以外的时间间隔度量。所以,我们可以使用函数difftime确定不同单位下的时间间隔(例如,小时、天和周)。虽然difftime提供了更多的度量选择,但我们还需要更多计算来得到以月和年为单位的时间间隔。
为了简化日期计算,我们可以使用便捷的日期运算程序包lubridate。因为数据是年-月-日的格式,我们首先可以使用函数ymd把数据转换成POSIX格式。然后,我们可以使用区间函数计算hire_date和birth_date之间的时间跨度。接着,我们可以使用函数as.period计算时间跨度的长度。这可以让我们使用函数year获取每一个雇员生日和受雇日之间的年份数。
最后,为了计算雇员的年龄,我们可以使用函数now获取当前时间。然后,使用interval获取雇员生日和当前日期之间的时间区间。利用这些信息,我们最终可以使用函数year获取雇员的真实年龄。
更多技能
在使用lubridate程序包(版本1.3.3)的时候,你可能会收到下列报错信息:
这个报错信息是由于本地配置问题而产生的。你可以通过设定locale为English_United States.1252来解决: