日期和时间变量处理包
lubridate: Dates and times
Date-times
- date-time 是时间线上的一个点,以秒为存储单位,起始于1970-01-01 00:00:00 UTC #
base::as.POSIXct(x,farmat,origin)
dt <- as_datetime(1511870400) |
- date是从1970-01-01开始的天数 #
base::as.Date(x,"%Y-%m-%d")
d <- as_date(17498) |
- hms是从00:00:00开始的秒数
t <- hms::as.hms(85) |
- 解析时间 (Convert strings or numbers to date-times)
- 识别出数据中 year (y), month (m), day (d), hour (h), minute (m) and second (s) 元素的顺序
- 用下面的函数,函数的名字代表顺序,函数接收多种多样的输入形式
date_decimal(decimal, tz = “UTC”) 解析小数形式
date_decimal(2017.5)
fast_strptime() 快速解析字符格式
fast_strptime(‘9/1/01’, ‘%y/%m/%d’)
parse_date_time() 简单解析字符格式
parse_date_time(“9/1/01”, “ymd”)
获取当前日期/时间
today(tzone = “”) Date object (base::Sys.Date() )
now(tzone = “”) POSIXct object(base::date() )
- 获取/设置时间组件
>>> d <- ymd("2017-11-28") |
quarter(x, with_year = FALSE, fiscal_start = 1) 季度
semester(x, with_year = FALSE) (尤指美国的大专院校的) 学期,半学年
dst(x) 夏令时(daylight savings time)?
leap_year(x) 闰年?
update(object, …, simple = FALSE)
update(dt, mday = 2, hour = 1)
Round Date-times
floor_date(x, unit = "second") # 向下滚动到最近的单位 |
图示
floor_date(dt, unit = "month")
round_date(dt, unit = "month")
ceiling_date(dt, unit = "month")
Stamp Date-times
自定义一个Date-times的字符显示模板函数
stamp() , stamp_date() and stamp_time()
# 1. 创建模板函数 |
Time Zones
R可以识别 ~600 个时区,每一个区块都有编码时区,夏令时,历史日历(time zone, Daylight Savings Time, and historical calendar)变量,R为每个赋值一个 time zone向量。
通常用UTC 时区来避开夏令时
OlsonNames() 返回完整的时区名列表
with_tz() 返回另一个时区的date-time
force_tz 强制抓换时区,date-time数字不变
meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland") |
Time Spans
lubridate提供三种类型的时间块
- period:人类定义的时间单位, like years, months, and days.
- duration:以秒为单位的时间跨度(difftime是base R 中一种特殊的duration),当这个数字很大时,period也会以较大的单位显示一个估计值,底层总是为固定的秒数,常见的转换有Minutes = 60 seconds, hours = 3600 seconds, days = 86400 seconds, weeks = 604800,由于其变化性,未使用大于周的单位。
- interval:用指定的开始和结束日期创建的时间间隔。如果开始日期在结束日期之前发生,则间隔将为正值。否则,为负值。
- Period and Duration
period | duration |
---|---|
period(num = NULL, units = “second”, …)period(5, unit = "years") |
duration(num = NULL, units = “second”, …) duration(5, unit = “years”) |
as.period(x, unit) | as.duration(x, …) |
is.period() | is.duration(),is.difime() |
period_to_seconds(x) | make_difime(x)make_difftime(99999) |
seconds_to_period(x) |
period unit | 说明 | duration unit | 说明 |
---|---|---|---|
years(x = 1) | years | dyears(x = 1) | 31536000 seconds |
months(x) | months | ||
weeks(x = 1) | weeks | dweeks(x = 1) | 604800 seconds |
days(x = 1) | days | ddays(x = 1) | 86400 seconds |
hours(x = 1) | hours | dhours(x = 1) | 3600 seconds |
minutes(x = 1) | minutes | dminutes(x = 1) | 60 seconds |
seconds(x = 1) | seconds | dseconds(x = 1) | seconds |
milliseconds(x = 1) | milliseconds | dmilliseconds(x = 1) | 10**3 seconds |
microseconds(x = 1) | microseconds | dmicroseconds(x = 1) | 10**6 seconds |
nanoseconds(x = 1) | nanoseconds | dnanoseconds(x = 1) | 10**9 seconds |
picoseconds(x = 1) | picoseconds | dpicoseconds(x = 1) | 10**12 seconds |
示例:period和duration也可由组件的数学计算得到
period(c(90, 5), c("second", "minute")) # "5M 90S" |
- Interval
interval:用指定的开始和结束日期创建的时间间隔。如果开始日期在结束日期之前发生,则间隔将为正值。否则,为负值。
创建 | 说明 |
---|---|
interval(start, end, tzone = tz(start)) | |
start %–% end | 符号创建 |
as.interval(x, start, …) | 参数x:duration, difftime, period, or numeric object |
base::difftime(time1, time2, tz,units =“auto”) | |
is.interval(x) | 判断函数 |
组件 | |
int_start(int) int_start(int) <- value |
date-time |
int_end(int) int_end(int) <- value |
结束date-time |
interval的长度由使用时的对象(period, duration)划定
s<- ymd("2017-01-01"); e <- ymd("2017-11-28") |
函数 | 说明 |
---|---|
a %within% b | logical,a在b区间内,{a: interval or date-time object,b: interval} |
int_length(int) | Length in seconds |
int_flip(int) | 反转 |
int_standardize(int) | 标准化 |
int_shift(int, by) | 平移interval |
int_overlaps(int1, int2) | logical,判断int1和int2是否重叠 |
int_aligns(int1, int2) | int1, int2是否分享相同边界 |
int_diff(times) | 用n个date-time分割成n-1个intervals向量 |
>>> dt <- today() |
Math with Date-times
- 夏令时(Daylight Saving Time, DST)
夏令时(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏令时的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
- Date-times数学运算
Date-times数学运算依赖于计算的时间点,位于夏令时开始、结束时间、润年、闰秒时,计算有所不同。
并不是所有的年都是365d,不是所有的分钟都是60s,普通的数据运算可能会产生虚拟日期,lubridate提供了操作符和函数。
数学运算 | 说明 |
---|---|
%m+% and %m-% |
滚动到前一月的最后一天 |
add_with_rollback(e1, e2, roll_to_first =TRUE) | 滚动到新一月的第一天 |
jan31 <- ymd(20180131) |
hms: time-of-day values
hms包提供了一个简单的类来存储持续时间或时间值,并以hh:mm:ss
格式显示它们。该类旨在简化与数据库,电子表格和其他数据源的数据交换。
hms(seconds, minutes, hours, days)
as.hms(x)
x可以是字符,数字等
Usage
library(hms) |