lubridate包常用于處理時間資料的資料集,提供很便利的決議日期與時間的內置函式,相較于R內置的時間處理函式,lubridate包的處理方法會更快且更加豐富,lubridate包主要有兩類函式,一類是處理時點資料(time instants),另一類是處理時段資料(time spans),
1. 決議日期和時間
以下的內置函式可用于根據輸入向量中年月日元素的順序決議日期,可以將字符和數字向量中的日期轉換為date或者POSIXct物件,這些函式可以識別任意的非數字分隔符(或者無分隔符)的日期元素,只要格式的順序是正確的,這些函式就可以正確地決議日期,即使輸入向量包含不同格式的日期元素,
#決議年月日時間型別
ymd(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議年日月時間型別
ydm(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議月日年時間型別
mdy(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議月年日時間型別
myd(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議日月年時間型別
dmy(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議日年月時間型別
dym(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議季度型別
yq(..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"))
- …:包含疑似日期型別的字符或數字向量;
- quiet:邏輯值,TRUE轉換后不顯示訊息;
- tz:指定時區,為NULL(默認值)直接回傳Date物件,否則將帶有時區屬性的;POSIXct設定為tz;
- Locale:設定語言環境;
- truncated:設定可以被截斷格式的數量
– 舉例1:
library(lubridate)
x <- c(20170101, "2017-01-02", "2017/01/02","201701-02","2017/01-
02", "2017 01 03", "2017-1-4","2017-1, 5", "Created on 2017 1 6",
"201701 !!! 07")
#使用ymd決議時間型別,可以決議不同格式的日期元素
ymd(x)
– 舉例2:
y <- " aaaa 01aaasd07asdfa2017asdaa"
#使用mdy決議月日年,可以提取出日期元素而不管分隔符
mdy(y)
– 舉例3:
z <- "2017-01"
#z缺少日元素,使用ymd決議時顯示warning資訊,回傳NA
ymd(z)
#設定quiet=TRUE,不顯示warning資訊
ymd(z, quiet = TRUE)
#只缺少日元素,設定truncated>=1即可使用ymd決議
ymd(z, truncated = 1)
z <- "2017"
#只缺少兩個元素,設定truncated>=2才可使用ymd決議
ymd(z, truncated = 2)
m <- "1707"
#默認都是缺少右側的元素,因此此例缺少年,決議為"0000-07-17"
dmy(m, truncated = 1)
#實際表示2017年8月,但是決議程序中有可能造成錯誤
n <- "1708"
#使用truncated=1決議為2017-08-01
ymd(n, truncated = 1)
#使用truncated=2,n當作1708年,因此決議為1708-01-01
ymd(n, truncated = 2)
– 舉例4:
p <- c("2017-1", "2017/02", "2017aaa3", "201704")
#決議為2017年每個季度
yq(p)
決議月日年時分秒,自動的分配世界標準時間UTC時區給決議后的date,
#決議年月日時分秒時間型別
ymd_hms(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議年月日時分時間型別
ymd_hm(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議年月日時時間型別
ymd_h(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議日月年時分秒時間型別
dmy_hms(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議日月年時分時間型別
dmy_hm(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議日月年時時間型別
dmy_h(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議月日年時分秒時間型別
mdy_hms(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議月日年時分時間型別
mdy_hm(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議月日年時時間型別
mdy_h(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議年日月時分秒時間型別
ydm_hms(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議年日月時分時間型別
ydm_hm(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
#決議年日月時時間型別
ydm_h(..., quiet = FALSE, tz = "UTC", locale = Sys.getlocale("LC_TIME"), truncated = 0)
– 舉例5:
x <- c(20100101120101, "2009-01-02 12-01-02", "2009.01.03 12:01:03","2009-1-4 12-1-4", "2009-1, 5 12:1, 5",
"200901-08 1201-08", "2009 arbitrary 1 non-decimal 6 chars 12 in between 1 !!! 6", "OR collapsed formats: 20090107 120107 (as long as prefixed with zeros)", "Automatic wday, Thu, detection, 10-01-10 10:01:10 and p format: AM",
"Created on 10-01-11 at 10:01:11 PM")
#決議出年月日時分秒
ymd_hms(x)
– 舉例6:
x <- c("2011-12-31 12:59:59", "2010-01-01 12:11", "2010-01-01
12", "2010-01-01")
#決議為年月日時分秒
ymd_hms(x, truncated = 3)
x <- c("2011-12-31 12:59", "2010-01-01 12", "2010-01-01")
ymd_hm(x, truncated = 2)
僅決議時分秒
#決議分秒
ms(..., quiet = FALSE, roll = FALSE)
#決議時分
hm(..., quiet = FALSE, roll = FALSE)
#決議時分秒
hms(..., quiet = FALSE, roll = FALSE)
- …:時分秒組成的字符向量;
- quiet:邏輯值,TRUE轉換后不顯示訊息;
- roll:邏輯值,為TRUE表示自動進位轉換,如61秒會轉換為1分01秒,默認值為FALSE不轉換;
#決議為時分秒物件
hms("7 6 5", "3:23:::2", "2 : 23 : 33", "Finished in 9 hours, 20 min and 4 seconds")
#決議為時分秒物件,秒為0s
hm("6,5")
#決議為時分秒物件報錯,Some strings failed to parse,只能使用包含兩個數
#字的字符
hm("6,5,4")
#決議為時分秒物件,”-“會被決議為負號, 回傳9H 10M -10S"
hms("9:10-10")
#決議為時分秒物件,設定roll為TRUE,自動與分進行運算,回傳"9H 9M 50S"
hms("9:10-10",roll = TRUE)
#決議為時分秒物件,設定roll為TRUE,自動與分進行運算,回傳"9H 11M 20S"
hms("9:10:80",roll = TRUE)
決議時間程序中如果遇到年月日無序排列的情況可以使用以下函式決議,
#將格式各樣的日期時間字符轉換為日期時間型別的資料
parse_date_time(x, orders, tz = "UTC", truncated = 0, quiet = FALSE, locale = Sys.getlocale("LC_TIME"), select_formats = .select_formats, exact = FALSE)
#更快速的C決議函式
parse_date_time2(x, orders, tz = "UTC", exact = FALSE, lt = FALSE)
#更快速的C決議函式,需要顯式的format
fast_strptime(x, format, tz = "UTC", lt = TRUE)
- x:字符或者數字表示的日期;
- orders:date-time形式的字符向量,每個order可以是strptime中列出的格式化字符,但是可以不包含“%”前綴, 決議程序中會丟棄格式化字符中包含的任意的分隔符;
- tz : 字串用于指定決議日期的時區;
- truncated: 設定可以被截斷格式的數量;
- quiet:邏輯值,TRUE轉換后不顯示訊息;
- locale: 設定語言環境;
- select_formats:函式,從匹配訓練集的formats中選出實際用于決議時間的formats,輸入為整型向量,回傳字符向量表示的formats
- exact: 邏輯值,為TRUE則將orders引數解釋為精確的strftime格式,并且不執行訓練或猜測;
- lt:邏輯值,TRUE回傳POSIXlt類物件,否則回傳POSIXct類物件,為了與strptime兼容,'fast_strptime'默認lt = TRUE, 'parse_date_time2'默認lt = FALSE;
- format:字串表示的formats,每個format必須帶有strptime相同的引數前綴,并且需要包含所有的分隔符;
– 舉例8:
#決議程序format的分隔符會被忽略
x <- c("09-01-01", "09-01-02", "09-01-03")
parse_date_time(x, "ymd")
parse_date_time(x, "y m d")
parse_date_time(x, "%y%m%d")
parse_date_time(x, "y-md")
parse_date_time(x, "y---m///d")
#orders包含多個formats,可用于決議formats設定的時間物件
x <- c("2009-01-01", "02022010", "02-02-2010")
parse_date_time(x, c("dmY", "ymd"))
#設定truncated = 3,如果不存在時間物件決議為00:00:00
x <- c("2011-12-31 12:59:59", "2010-01-01 12:11", "2010-01-01 12", "2010-01-01")
parse_date_time(x, "Ymd HMS", truncated = 3)
#設定exact引數,精確的決議時間物件
x <- c("09-01-01", "090102", "09-01-03 12:02")
parse_date_time(x, c("%m-%d-%y", "%m%d%y", "%m-%d-%y %H:%M"),
exact = TRUE)
parse_date_time(c('12/17/1996 04:00:00','4/18/1950 0130'),
c('%m/%d/%Y %I:%M:%S','%m/%d/%Y %H%M'), exact = TRUE)
– 舉例9:
#按指定的時區決議時間物件,回傳POSIXct物件
parse_date_time2("2010-03-14 02:05:06", "YmdHMS", tz = "Asia/Shanghai")
#按指定的時區決議時間物件,設定lt=TRUE,回傳POSIXlt物件
parse_date_time2("2010-03-14 02:05:06", "YmdHMS", tz = "Asia/Shanghai", lt = TRUE)
– 舉例10:
dates <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92")
times <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")
date_time <- paste(dates, times)
#按固定格式決議時間物件,回傳POSIXlt類物件,默認時區為UTC
fast_strptime(date_time, "%m/%d/%y %H:%M:%S")
#按固定格式決議時間物件,回傳POSIXct類物件,默認時區為UTC
fast_strptime(date_time, "%m/%d/%y %H:%M:%S", lt = FALSE)
#按固定格式決議時間物件,回傳POSIXlt類物件,按時區Asia/Shanghai決議
fast_strptime(date_time, "%m/%d/%y %H:%M:%S", tz = "Asia/Shanghai")
2. 設定和提取時間資訊
lubridate同時也提供了從datetime物件中提取時間的各個元素的函式,例如提取datetime中的year,month和day等,提取程序包括精確提取和模糊提取(即取整),
#回傳或設定日期物件中的day
day(x)
day(x) <- value
#回傳或設定日期物件中的當月的某一天
mday(x)
mday(x) <- value
#回傳或設定日期物件中的當周的某一天
wday(x, label = FALSE, abbr = TRUE)
wday(x) <- value
#回傳或設定日期物件中的當季的某一天
qday(x)
qday(x) <- value
#回傳或設定日期物件中的當年的某一天
yday(x)
yday(x) <- value
#回傳或設定日期物件中的hour
hour(x)
hour(x) <- value
#回傳或設定日期物件中的minute
minute(x)
minute(x) <- value
#回傳或設定日期物件中的second
second(x)
second(x) <- value
#回傳或設定日期物件中的month
month(x, label = FALSE, abbr = TRUE)
month(x) <- value
#回傳或設定日期物件中的year
year(x)
year(x) <- value
#回傳引數所表示的月總共有多少天
days_in_month(x)
- x:POSIXct, POSIXlt, Date, chron, yearmon, yearqtr, zoo, zooreg, timeDate, xts, its, ti, jul, timeSeries或者fts物件;
- label:邏輯值,僅適用于wday函式,為TRUE使用有序的字串(eg: Sunday)因子顯示week中的day,FALSE使用數字代表day,weekday默認周日為1;
- abbr:邏輯值,僅適用于wday函式,為FALSE使用有序的字串(eg: Sunday)因子顯示week中的day,TRUE使用縮寫的字符(eg: Sun)因子表day;
- value:數值物件;
– 舉例1:
#獲取當前時間
time <- Sys.time()
#回傳日期物件中的day
day(time)
#回傳日期物件是當月的第幾天
mday(time)
#回傳日期物件是當季的第幾天
qday(time)
#回傳日期物件是當年的第幾天
yday(time)
#回傳日期物件是當周的第幾天
wday(time)
#回傳日期物件是當周的第幾天,回傳字串因子
wday(time, label = TRUE, abbr = FALSE)
#回傳日期物件是當周的第幾天,回傳縮寫的字串因子
wday(time, label = TRUE, abbr = TRUE)
– 舉例2:
#獲取當前時間
time <- Sys.time()
#設定日期物件為第15天
day(time) <- 15
#設定日期物件為當月的第10天
mday(time) <- 10
#設定日期物件是當季的第30天
qday(time) <- 30
#回傳日期物件是當年的第365天
yday(time) <- 365
– 舉例3:
#獲取當前時間
time <- Sys.time()
#回傳日期物件中的hour
hour(time)
#回傳日期物件中的minute
minute(time)
#回傳日期物件中的second
second(time)
– 舉例4:
#獲取當前時間
time <- Sys.time()
#回傳日期物件中用數字表示的月
month(time)
#回傳日期物件中用字符表示的月
month(time, label = TRUE, abbr = FALSE)
#回傳日期物件中用縮寫字符表示的月
month(time, label = TRUE, abbr = TRUE)
– 舉例5:
#獲取當前時間
time <- Sys.time()
#回傳日期物件中用數字表示的年
year(time)
– 舉例6:
#回傳2016年2月總共有的天數
days_in_month(as.Date("2016-02-01"))
模糊提取時間資訊,即對提取的資訊取整到不同的單元,可以取整到最近的unit或unit的倍數,其中unit支持所有有意義的英文單元,如secs, min, mins, 2 minutes和3 years 等,取整程序中函式ceiling_date通常會轉換物件為較低的時刻值(如,2000-01-01 –> 2000-01-01 00:00:00),然后根據設定的unit轉換為下一個最近的unit邊界值,對于引數change_on_boundary取默認值NULL或者FALSE時, 比設定的unit低級的時間元素如果為00,則不進位,否則向上進位,例如unit =minute,若此時的秒為00,則不進位,如果為01則minute向上進位,
# 四舍五入取整
round_date(x, unit = "second")
# 向下取整
floor_date(x, unit = "seconds")
# 向上取整
ceiling_date(x, unit = "seconds", change_on_boundary = NULL)
- x:datetime物件組成的向量;
- unit : 字串表示的一個時間單元或時間單元的倍數,有效的時間單元包括second, minute, hour, day, week, month, bimonth, quarter, halfyear或 year,另外也支持period建構式中使用的英文縮寫形式;
- change_on_boundary : 默認值為NULL,不會修改特定時刻的邊界,但是對date物件依然會向上舍入到下一個邊界,相反設定為TRUE,進行向上舍入,為FALSE時與NULL 類似;
– 舉例6:
#回傳2017-08-31 12:02:00 CST
round_date(as.POSIXct("2017-08-31 12:01:59.50"), "second")
#回傳2017-08-31 12:01:59 CST
round_date(as.POSIXct("2017-08-31 12:01:59.49"), "second")
#回傳2017-08-31 12:02:00 CST
round_date(as.POSIXct("2017-08-31 12:01:30.49"), "minute")
#回傳2017-08-31 12:01:00 CST
round_date(as.POSIXct("2017-08-31 12:01:29.49"), "minute")
#回傳2017-08-31 12:05:00 CST
round_date(as.POSIXct("2017-08-31 12:02:30"), "5 mins")
#回傳2017-08-31 12:00:00 CST
round_date(as.POSIXct("2017-08-31 12:02:29"), "5 mins")
#回傳2017-08-31 12:00:00 CST
round_date(as.POSIXct("2017-08-31 12:29:59"), "hour")
#回傳2017-08-31 13:00:00 CST
round_date(as.POSIXct("2017-08-31 12:30:00"), "hour")
#回傳2017-08-31 12:00:00 CST
round_date(as.POSIXct("2017-08-31 11:00:00"), "2 hours")
#回傳2017-08-31 10:00:00 CST
round_date(as.POSIXct("2017-08-31 10:59:00"), "2 hours")
#回傳2017-09-01 CST
round_date(as.POSIXct("2017-08-31 12:00:00"), "day")
#回傳2017-08-31 CST
round_date(as.POSIXct("2017-08-31 11:59:59"), "day")
#回傳2017-09-03 CST
round_date(as.POSIXct("2017-08-30 12:00:00"), "week")
#回傳2017-08-27 CST
round_date(as.POSIXct("2017-08-30 11:59:59"), "week")
#回傳2017-09-01 CST
round_date(as.POSIXct("2017-08-16 12:00:00"), "month")
#回傳2017-08-01 CST
round_date(as.POSIXct("2017-08-16 11:59:59"), "month")
#回傳2017-09-01 CST
round_date(as.POSIXct("2017-08-01 00:00:00"), "2 months")
round_date(as.POSIXct("2017-08-01 00:00:00"), "bimonth")
#回傳2017-07-01 CST
round_date(as.POSIXct("2017-07-31 00:00:00"), "2 months")
round_date(as.POSIXct("2017-07-31 00:00:00"), "bimonth")
#回傳2017-10-01 CST
round_date(as.POSIXct("2017-08-16 00:00:00"), "quarter")
round_date(as.POSIXct("2017-08-16 00:00:00"), "3 months")
#回傳2017-07-01 CST
round_date(as.POSIXct("2017-08-15 00:00:00"), "quarter")
round_date(as.POSIXct("2017-08-15 00:00:00"), "3 months")
#回傳2018-01-01 CST
round_date(as.POSIXct("2017-10-01 00:00:00"), "halfyear")
#回傳2017-07-01 CST
round_date(as.POSIXct("2017-09-30 00:00:00"), "halfyear")
#回傳2018-01-01 CST
round_date(as.POSIXct("2017-07-03 00:00:00"), "year")
#回傳2017-01-01 CST
round_date(as.POSIXct("2017-07-02 00:00:00"), "year")
– 舉例7:
#回傳2017-08-31 12:01:59 CST
floor_date(as.POSIXct("2017-08-31 12:01:59.50"), "second")
#回傳2017-08-31 12:01:00 CST
floor_date(as.POSIXct("2017-08-31 12:01:59.49"), "minute")
#回傳2017-08-31 12:00:00 CST
floor_date(as.POSIXct("2017-08-31 12:02:30"), "5 mins")
#回傳2017-08-31 12:00:00 CST
floor_date(as.POSIXct("2017-08-31 12:30:00"), "hour")
#回傳2017-08-31 10:00:00 CST
floor_date(as.POSIXct("2017-08-31 11:00:00"), "2 hours")
#回傳2017-08-31 CST
floor_date(as.POSIXct("2017-08-31 12:00:00"), "day")
#回傳2017-08-27 CST
floor_date(as.POSIXct("2017-08-30 12:00:00"), "week")
#回傳2017-08-01 CST
floor_date(as.POSIXct("2017-08-16 12:00:00"), "month")
#回傳2017-07-01 CST
floor_date(as.POSIXct("2017-08-01 00:00:00"), "bimonth")
#回傳2017-07-01 CST
floor_date(as.POSIXct("2017-08-16 00:00:00"), "quarter")
#回傳2017-07-01 CST
floor_date(as.POSIXct("2017-10-01 00:00:00"), "halfyear")
#回傳2017-01-01 CST
floor_date(as.POSIXct("2017-07-03 00:00:00"), "year")
– 舉例8:
#回傳2017-08-31 12:02:00 CST,使用毫秒直接進位
ceiling_date(as.POSIXct("2017-08-31 12:01:59.49"), "second")
ceiling_date(as.POSIXct("2017-08-31 12:01:59.49"), "second",
change_on_boundary = FALSE)
ceiling_date(as.POSIXct("2017-08-31 12:01:59.49"), "second",
change_on_boundary = TRUE)
#回傳2017-08-31 12:01:59 CST,不進位
ceiling_date(as.POSIXct("2017-08-31 12:01:59"), "second")
ceiling_date(as.POSIXct("2017-08-31 12:01:59"), "second",
change_on_boundary = FALSE)
#回傳2017-08-31 12:01:00 CST
ceiling_date(as.POSIXct("2017-08-31 12:01:00"), "minute")
ceiling_date(as.POSIXct("2017-08-31 12:01:00"), "minute",
change_on_boundary = FALSE)
#回傳2017-08-31 12:02:00 CST
ceiling_date(as.POSIXct("2017-08-31 12:01:01"), "minute")
ceiling_date(as.POSIXct("2017-08-31 12:01:01"), "minute",
change_on_boundary = FALSE)
#回傳2017-08-31 12:02:00 CST
ceiling_date(as.POSIXct("2017-08-31 12:01:00"), "minute",
change_on_boundary = TRUE)
ceiling_date(as.POSIXct("2017-08-31 12:01:01"), "minute",
change_on_boundary = TRUE)
#回傳2017-08-31 12:05:00 CST
ceiling_date(as.POSIXct("2017-08-31 12:00:01"), "5 mins")
ceiling_date(as.POSIXct("2017-08-31 12:00:01"), "5 mins",
change_on_boundary = FALSE)
ceiling_date(as.POSIXct("2017-08-31 12:00:01"), "5 mins",
change_on_boundary = TRUE)
#回傳2017-08-31 13:00:00 CST
ceiling_date(as.POSIXct("2017-08-31 12:30:00"), "hour")
#回傳2017-08-31 14:00:00 CST
ceiling_date(as.POSIXct("2017-08-31 12:30:00"), "2 hours")
#回傳2017-08-31 CST,不進位
ceiling_date(as.POSIXct("2017-08-31"), 'day')
ceiling_date(as.POSIXct("2017-08-31"), 'day', change_on_boundary
= FALSE)
#回傳2017-09-01 CST
ceiling_date(as.POSIXct("2017-08-31"), 'day', change_on_boundary
= TRUE)
#回傳2017-08-31 CST,不進位
ceiling_date(as.POSIXct("2017-08-31 00:00:00"), 'day')
ceiling_date(as.POSIXct("2017-08-31 00:00:00"), 'day',
change_on_boundary = FALSE)
#回傳2017-09-01 CST
ceiling_date(as.POSIXct("2017-08-31 00:00:00"), 'day',
change_on_boundary = TRUE)
#回傳2017-09-01 CST
ceiling_date(as.POSIXct("2017-08-31 00:00:01"), 'day')
ceiling_date(as.POSIXct("2017-08-31 00:00:01"), 'day',
change_on_boundary = FALSE)
#回傳2017-09-03 CST
ceiling_date(as.POSIXct("2017-08-30 11:59:59"), "week")
#回傳2017-08-01 CST
ceiling_date(as.POSIXct("2017-08-01 00:00:00"), "month")
#回傳2017-09-01 CST
ceiling_date(as.POSIXct("2017-08-01 00:00:01"), "month")
ceiling_date(as.POSIXct("2017-08-01 00:00:00"), "month",
change_on_boundary = TRUE)
#回傳2017-07-01 CST
ceiling_date(as.POSIXct("2017-07-01 00:00:00"), "bimonth")
#回傳2017-09-01 CST
ceiling_date(as.POSIXct("2017-07-01 00:00:01"), "bimonth")
ceiling_date(as.POSIXct("2017-07-01 00:00:00"), "bimonth",
change_on_boundary = TRUE)
#回傳2017-07-01 CST
ceiling_date(as.POSIXct("2017-07-01 00:00:00"), "quarter")
#回傳2017-10-01 CST
ceiling_date(as.POSIXct("2017-07-01 00:00:01"), "quarter")
ceiling_date(as.POSIXct("2017-07-01 00:00:00"), "quarter",
change_on_boundary = TRUE)
#回傳2017-07-01 CST
ceiling_date(as.POSIXct("2017-07-01 00:00:00"), "halfyear")
#回傳2018-01-01 CST
ceiling_date(as.POSIXct("2017-07-01 00:00:01"), "halfyear")
ceiling_date(as.POSIXct("2017-07-01 00:00:00"), "halfyear",
change_on_boundary = TRUE)
#回傳2017-01-01 CST
ceiling_date(as.POSIXct("2017-01-01 00:00:00"), "year")
#回傳2018-01-01 CST
ceiling_date(as.POSIXct("2017-01-01 00:00:01"), "year")
ceiling_date(as.POSIXct("2017-01-01 00:00:00"), "year",
change_on_boundary = TRUE)
3. 獲取和修改時區
關于時區的操作,lubridate提供了讀取并修改時區屬性的方法tz,但是修改時區屬性并不會改變時間物件本身,可以使用with_tz和force_tz函式進行修改,前者將時間資料轉換為另一個時區的同一時間,實際的時刻并沒有改變,后者時間資料的時區強制轉換為另一個時區,實際的時鐘時刻已被修改, 如果輸入的時區不存在,將使用默認的UTC時區,
#回傳或設定日期物件中的timezone屬性
tz(x)
tz(x) <- value
#在新時區下生成新的時鐘時刻,實際時鐘時刻并沒有被修改
with_tz(time, tzone = "")
#在新的時區顯示相同的時鐘時刻,實際時鐘時刻已改變
force_tz(time, tzone = "")
– 舉例1:
#使用ymd_hms會自動分配UTC時區
tzone <- ymd_hms("2017-08-20 20:20:20")
#獲取物件的時區
tz(tzone)
#更改時區并不會修改時間物件本身,只是修改了物件的時區屬性
tz(tzone) <- "GMT"
– 舉例2:
#美國的Estern time
est <- ymd_hms("2017-08-22 09:00:00", tz = "America/New_York")
#轉換中國時區所對應的時鐘時刻
with_tz(est, tzone = "Asia/Shanghai")
– 舉例3:
#美國的Estern time
est <- ymd_hms("2017-08-22 09:00:00", tz = "America/New_York")
#只修改時區,時鐘時刻不變,實際上原始的時刻已被修改
force_tz(est, tzone = "Asia/Shanghai")
4. 時間跨度
lubridate對時間跨度有三種表示方式,包括Intervals, durations和periods,Interval可以不同的unit精確的記錄時間跨度,但是對于較大的時間單位(小時,月,年等),可能會受到閏年和夏令時的影響,Durations顯示在一段時間內發生的秒數,如果數字很大,會以更大的unit顯示出估計值,底層通常被記錄為固定的秒數,因此durations并不會受閏年和夏令時的影響,Periods用于記錄兩個datetime型別的時鐘時間,可以用years, months, days, hours, minutes和seconds表示,除秒外其它單元都必須用整數表示,由于受閏年和夏令時的影響,period并沒有固定的長度,除非與一個具體的開始時間配對后,
durations類通常提供了更準確的運算結果, 一個duration年總是等于365天, 而periods是隨著時間線的波動而給出更理性的結果,這一特點在建立時鐘時間(clock times)的模型時非常有用,比方說,durations遇到閏年時,結果就太死板,而periods給出的結果就靈活很多,
- 時間差(difftime)
make_difftime函式可以根據指定的unit創建difftime物件,顯示的時候根據unit給出估計的值,底層依然以second記錄時間,unit僅用于設定顯示的unit
#生成difftime物件
make_difftime(num = NULL, units = "auto", ...)
– 舉例1:
#以second記錄時間差,按照unit顯示,數值都是以second為單位
make_difftime(1)
make_difftime(60)
make_difftime(3600)
make_difftime(3600, units = "minute")
#以second記錄時間差,按照unit顯示
make_difftime(second = 3,minute = 1.5,hour = 2,day = 6, week = 1)
make_difftime(hour = 1, minute = -60)
make_difftime(day = -1)
#120表示120秒(2 mins)
make_difftime(120, day = -1, units = "minute")
- 時間間隔(interval)
時間間隔由兩個時間點(start time和end time)組成的Interval類物件,如果start time早于end time則interval為正,反之為負,
#interval函式用于生成時間間隔物件
interval(start, end, tzone = attr(start, "tzone"))
start %--% end
- start : 開始時間,POSIXt 或者date-time物件;
- end : 結束時間,POSIXt 或者date-time物件;
- tzone : 用于顯示時間間隔的時區
– 舉例2:
date1 <- as.POSIXct("2009-03-08 01:59:59")
date2 <- as.POSIXct("2000-02-29 12:00:00")
#正interval
interval(date2, date1)
date2 %--% date1
#負interval
interval(date1, date2)
date1 %--% date2
as.interval用于將描述時間間隔的物件duration, difftime, period或者numeric,結合POSIXt或Date物件表示的start time,轉換為Interval物件,
#用于轉換為interval物件
as.interval(x, start, ...)
– 舉例3:
#difftime,轉換為interval
diff <- make_difftime(days = 31)
as.interval(diff, ymd("2009-01-01"))
as.interval(diff, ymd("2009-02-01"))
#duration,轉換為interval
dur <- duration(days = 31)
as.interval(dur, ymd("2009-01-01"))
as.interval(dur, ymd("2009-02-01"))
#period,轉換為interval
per <- period(months = 1)
as.interval(per, ymd("2009-01-01"))
as.interval(per, ymd("2009-02-01"))
#numeric,轉換為interval,3600代表3600天
as.interval(3600, ymd("2009-01-01"))
interval操作函式
#判斷是否為interval物件
is.interval(x)
#獲取或設定interval的開始時間
int_start(int)
int_start(int) <- value
#獲取或設定interval的結束時間
int_end(int)
int_end(int) <- value
#回傳interval的長度
int_length(int)
#調換interval中開始時間和結束時間的順序
int_flip(int)
#按給定的位移調整interval,使用duration和period實際的interval長度不變
int_shift(int, by)
#判斷兩個interval是否有重疊
int_overlaps(int1, int2)
#標準化interval,保證interval為正
int_standardize(int)
#判斷兩個interval是否使用相同的端點,不考慮interval的方向
int_aligns(int1, int2)
#回傳日期時間向量間的間隔(interval物件)
int_diff(times)
#如果interval a完全在b中趕回TRUE(包括邊界并且忽略順序),否則回傳FALSE
a %within% b
- x:R物件
- int,int1,int2: interval物件
- by:period或者duration物件表示的位移值
- times:POSIXct, POSIXlt或Date物件表示的向量
– 舉例4:
date1 <- as.POSIXct("2017-09-01 01:59:59")
date2 <- as.POSIXct("2017-09-10 12:00:00")
#回傳正的interval,結束時間大于開始時間
inter1 <- interval(date1, date2)
#提取開始時間和結束時間
int_start(inter1)
int_end(inter1)
#回傳interval的長度以秒為單位,正interval回傳813601秒
int_length(inter1)
#原interval向后調整一天,實際的int_length不變
int_shift(inter1, by = duration(days = 1))
int_shift(inter1, by = period(days = 1))
#回傳負的interval,結束時間小于開始時間
inter2 <- date2 %--% date1
#回傳interval的長度以秒為單位,負interval回傳-813601秒
int_length(inter2)
#調換interval的順序,轉換后interval為正
int_flip(inter2)
#標準化interval,是interval保持為正
int_standardize(inter2)
#判斷兩個interval之間是否存在重疊,存在重疊回傳TRUE
int_overlaps(inter1, inter2)
#判斷兩個interval之間是否存在重疊,不存在重疊回傳FALSE
int_overlaps(inter1, int_shift(inter1, by = period(days = 10)))
#回傳interval表示的各POSIXct物件間的差
dates <- now() + days(1:10)
int_diff(dates)
#回傳TRUE,inter1完全在inter1中
inter1 %within% inter1
#回傳TRUE,inter1完全在inter2中,忽略interval的正負(順序)
inter1 %within% inter2
#回傳FALSE,位移過后不完全在inter1中
int_shift(inter1, by = duration(days = 1)) %within% inter1
- 持續時間(durations)
duration底層物件都是用秒表示,顯示時,如果時間跨度較大,會同時使用較大單元的估計值,可以用minutes, hours, days 和weeks顯示duration,超出week的unit變化較大,因此不能用于表示duration,
#創建duration物件
duration(num = NULL, units = "seconds", ...)
- num:時間單元的數量,可以為字符向量,支持縮寫;
- units: 字串表示的時間單元,默認為seconds,num為字符型時忽略該引數;
- … : 時間單元串列,可以為seconds, minutes, hours, day和 weeks;
– 舉例5:
#生成表示90s的duration物件
duration(90, "seconds")
duration(second = 90)
duration(minute = 1.5)
duration(mins = 1.5)
duration(1.5, "minutes")
#生成表示-86400s的duration物件
duration(day = -1)
duration(-1, "days")
#生成表示1130493s的duration物件,顯示為1.87weeks
duration(second = 3, minute = 1.5, hour = 2, day = 6, week = 1)
#使用字符創建duration物件
duration("2M 1sec")
duration("2hours 2minutes 1second")
duration("2d 2H 2M 2S")
duration("2days 2hours 2mins 2secs")
#表示為兩天
duration("day day")
#直接與字串比較大小,回傳TRUE
duration("day 2 sec") > "day 1sec"
#判斷是否為duration物件
is.duration(as.Date("2017-09-10"))
is.duration(duration(days = 12.4))
轉換period為duration時,period的實際大小取決于指定的開始時間,因此會轉換為不精確的估計值,并不存在period到 duration一對一的轉換,
#判斷是否為duration物件
is.duration(x)
#用于轉換 Interval, Period和numeric物件為duration物件
as.duration(x, ...)
– 舉例6:
#判斷是否為duration物件
is.duration(as.Date("2017-09-10"))
is.duration(duration(days = 12.4))
#轉換interval物件為duration物件
span <- interval(ymd("2017-09-01"), ymd("2017-09-10"))
as.duration(span)
#轉換numeric物件為duration物件,數字值單位為秒
as.duration(1000)
#轉換perido物件為duration物件,轉換的值為估計值
per <- period(months = 1)
as.duration(per)
創建duration物件
#使用seconds創建duration
dseconds(x = 1)
#使用minutes創建duration, 底層仍用second表示
dminutes(x = 1)
#使用hours創建duration, 底層仍用second表示
dhours(x = 1)
#使用days創建duration, 底層仍用second表示
ddays(x = 1)
#使用weeks創建duration, 底層仍用second表示
dweeks(x = 1)
#使用years創建duration, 底層仍用second表示
dyears(x = 1)
#使用milliseconds創建duration, 底層仍用second表示
dmilliseconds(x = 1)
#使用microseconds創建duration, 底層仍用second表示
dmicroseconds(x = 1)
#使用nanoseconds創建duration, 底層仍用second表示
dnanoseconds(x = 1)
#使用picoseconds創建duration, 底層仍用second表示
dpicoseconds(x = 1)
– 舉例7:
#生成表示60s的duration物件
dminutes(x = 1)
dseconds(x = 60)
dmilliseconds(x = 60000)
dmicroseconds(x = 60000000)
dnanoseconds(x = 60000000000)
dpicoseconds(x = 60000000000000)
#生成表示1 day的duration物件
ddays(x = 1)
dhours(x = 24)
dminutes(x = 1440)
dweeks(x = 1/7)
#duration默認一年為365天
dyears(x = 1/365)
- 時間周期(period)
period物件必須與實際的開始時間相結合后才有固定的長度,period的長度取決于匹配的開始時間,以2009-01-01 開始的一年有365天,以2012-01-01開始的年有366天,
#創建period物件
period(num = NULL, units = "second", ...)
#判斷是否為period物件
is.period(x)
#用于轉換 Interval, Period, difftime和numeric物件為period物件
as.period(x, unit, ...)
- num:表示時間單元的數值向量;
- units:字符向量表示的時間單元,與num必須有相同的長度;
- … : 時間單元串列,可以為seconds, minutes, hours, day和 weeks;
– 舉例8:
#表示period物件,num和units按順序分別對應
period(c(90, 5), c("second", "minute"))
period(c(3, 1, 2, 13, 1), c("second", "minute", "hour", "day", "week"))
period(second = 3, minute = 1, hour = 2, day = 13, week = 1)
period(c(1, -60), c("hour", "minute"))
period (second = 90, minute = 5)
period(c(1, -60), c("hour", "minute"), hour = c(1, 2), minute = c(3, 4))
period("2hours 2minutes 1second")
period("2H 2mins 1sec")
– 舉例9:
#判斷是否為period物件
is.period(as.Date("2017-09-10"))
is.period(period(days = 1))
leap <- interval(ymd("2016-01-01"), ymd("2017-01-01"))
#回傳366d 0H 0M 0S
as.period(leap, unit = "days")
#回傳1y 0m 0d 0H 0M 0S
as.period(leap, unit = "years")
#轉換數值為period,不設定unit默認為second,回傳1000S
as.period(1000)
#轉換數值為period,回傳1000M 0S
as.period(1000, unit = 'mins')
#轉換數值為period,回傳1000d 0H 0M 0S
as.period(1000, unit = 'days')
#轉換duration為period
as.period(dhours(x = 24))
#轉換difftime為period
as.period(make_difftime(day = 1))
創建period物件
#使用seconds創建period
seconds(x = 1)
#使用minutes創建period
minutes(x = 1)
#使用hours創建period
hours(x = 1)
#使用days創建period
days(x = 1)
#使用weeks創建period
weeks(x = 1)
#使用years創建period
years(x = 1)
#使用milliseconds創建period
milliseconds(x = 1)
#使用microseconds創建period
microseconds(x = 1)
#使用nanoseconds創建period
nanoseconds(x = 1)
#使用picoseconds創建period
picoseconds(x = 1)
#使用month創建period
months(x, abbreviate)
– 舉例10:
#創建表示1day的period物件
days(x = 1)
hours(x = 24)
minutes(x = 1440)
seconds(x = 86400)
weeks(x = 1/7)
#創建表示1year的period物件
years(x = 1)
months(x = 12)
5. 日期時間的計算
Datetime物件的計算比數值計算要復雜的多,時鐘時刻需要隨著夏令時,閏年和閏秒等周期性的校準,使得對時間的運算相對較復雜,而lubridate包可以簡化時間的運算得到精確的計算結果,
– 舉例13:
date <- as.POSIXct("2017-02-28 01:59:59")
#與period物件相加
date + days(1)
#與duration物件相加
date + ddays(1)
date2 <- as.POSIXct("2017-01-31 01:59:59")
#不存在的日期用NA表示
date2 + c(0:11) * months(1)
#超出每月最后一天的date,回傳每月最后一天
date2 %m+% (c(0:11) * months(1))
#可以同時與duration和period物件加減
date2 - days(3) + hours(6)
date2 - ddays(3) + hours(6)
#可以同時與duration和difftime物件加減
date2 + make_difftime(day = 2) - ddays(3)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/250281.html
標籤:其他
上一篇:MySQL鎖
