主頁 > 資料庫 > 【R語言】必學包之lubridate包

【R語言】必學包之lubridate包

2021-01-18 13:06:18 資料庫

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鎖

下一篇:SQLZOO翻譯及其代碼答案(2021/1/17更)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more