《R语言实战》学习笔记 —— 基本数据管理之日期值
1. 创建日期型变量
日期型通常以字符串形式输入到R中,然后转化为以数值形式存储的日期变量。日期具有一定的格式,见下表:
表1 日期格式
符号 | 含义 | 示例 |
%d | 数字表示的日期(0~31) | 01~31 |
%a | 缩写的星期名 | Mon |
%A | 非缩写的星期名 | Monday |
%m | 月份(00~12) | 00~12 |
%b | 缩写的月份 | Jan |
%B | 非缩写的月份 | January |
%y | 两位数的年份 | 07 |
%Y | 四位数的年份 | 2007 |
日期值得默认输入格式为
yyyy-mm-dd。例如语句:
mydates <- as.Date(c("2007-06-22", "2004-01-21"))
将默认格式的字符串转换为对应日期。相反,
strDates <- c("01/05/1965", "06/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y")
则使用mm/dd/yyyy的格式读取数据
在前面leadship数据框中,日期列时以mm/dd/yyyy的格式编码为字符型变量的。可以通过下面语句转换为日期型数据:
leadship$testDate <- as.Date(leadship$testDate,"%m/%d/%Y")
2. 计算和处理日期型变量
# 下面两个函数可以返回当前的日期和时间
> Sys.Date()
[1] "2018-01-28"
> date()
[1] "Sun Jan 28 21:53:57 2018"
# 可以使用format()函数来输出指定格式的日期值,或提取日期值得某些部分
> today <- Sys.Date()
> format(today, format="%B %d %Y")
[1] "一月 28 2018"
> format(today, format="%A")
[1] "星期日"
# R的内部存储日期时,是使用自1970年1月1日以来的天数表示的,更早的日期则表示为负数
# 日期值上可以进行算术运算
> startDate <- as.Date("2004-02-13")
> endDate <- as.Date("2011-01-22")
> days <- endDate - startDate
> days
Time difference of 2535 days
输出结果为2004年2月13日和2011年1月22日之间的天数
# 可以使用函数difftime()来计算时间间隔,并以星期、天、时、分、秒来表示
假设某人的出生日期是1991年6月17日,则:
> today<- Sys.Date( )
> dob <- as.Date("1991-10-12")
> difftime(today, dob, units = "weeks")
Time difference of 1372.143 weeks
> difftime(today, dob, units = "days")
Time difference of 9605 days
那么,这个人到今天为止已经有1372周或者说9605天大了。他出生在星期几呢?
3. 将日期转换为字符型变量
> strDates <- as.character(dates)
进行转换后就可以使用一系列字符处理函数来处理数据(如子集、替换、连接等)
更进一步地,
- 查看help(as.Date)和help(strftime),了解字符型转换为日期的更多细节;
- 参考help(ISOdatetime),了解更多关于日期和时间格式的知识;
- lubridate包中有许多简化日期处理的函数,可用于识别和解析日期-时间数据,抽取日期-时间成分,以及进行算术运算
- fCalendar包可以帮助对日期进行复杂的计算,提供大量的日期处理函数,可以同时处理多个时区,提供复杂的历法操作功能,支持工作日、周末和假期。