1. 程式人生 > >R語言筆記-日期/時間處理函式

R語言筆記-日期/時間處理函式

1.獲取當前日期/時間

  • 獲取日期
> Sys.Date()
[1] "2017-02-24"

注意:在R中日期實際是double型別,是從1970年1月1日以來的天數

  • 獲取時間
> date()
[1] "Fri Feb 24 17:23:35 2017"

注意:這種方法返回的是字串型別

> Sys.time()
[1] "2017-02-24 17:24:08 CST"

2. 把日期/時間輸出為字串

日期/時間 格式

格式 意義 示例
%d 數字表示的日期(0~31) 01~31
%a 縮寫的星期名 Mon
%A 非縮寫星期名 Monday
%m 月份(01~12 ) 01~12
%b 縮寫的月份 Jan
%B 非縮寫月份 January
%y 兩位數的年份 17
%Y 四位數的年份 2017
%H 00~23
%M 00~59
%S 00~59
  • format
today <- Sys.Date()
format(today, "%Y%m%d日")
[1] "2017年02月24日"
> time <- Sys.time
() > format(time, "%Y%m%d%H%M%S秒") [1] "2017年02月24日17時54分21秒"
  • as.character
> as.character(today, format="%Y%m%d日")
[1] "2017年02月24日"
> 
> as.character(time, format="%Y%m%d%H%M%S秒")
[1] "2017年02月24日17時54分21秒"

3. 字串轉為日期/時間

  • as.Date()

用as.Date()可以將一個字串轉換為日期值,預設格式是yyyy-mm-dd。
對於規則的格式,則不需要用format指定格式;如果輸入的格式不規則,可以通過format指定的格式讀入;標準格式

:年-月-日或者年/月/日;如果不是以上二種格式,則會提供錯誤;

> as.Date("2017-02-04")
[1] "2017-02-04"

> as.Date("2017/02/04")
[1] "2017-02-04"



另外,形式as.Date(x, origin) 返回自引數origin(引數值為一日期)起第x天。如as.Date(2, origin=”2017-02-04”)的返回結果為”2017-02-06”。

> as.Date(2, origin="2017-02-04")
[1] "2017-02-06"
  • POSIX類

There are two basic classes of date/times. Class “POSIXct” represents the (signed) number of seconds since the beginning of 1970 (in the UTC time zone) as a numeric vector. Class “POSIXlt” is a named list of vectors representing

POSIXct 是以1970年1月1號開始的以秒進行儲存,如果是負數,則是1970年以前;正數則是1970年以後。
POSIXlt 是以列表的形式儲存:年、月、日、時、分、秒;

預設情況下,日期之前是以/或者-進行分隔,而時間則以:進行分隔;
輸入的標準格式為:日期 時間(日期與時間中間有空隔隔開)
時間的標準格式為:時:分 或者 時:分:秒;
如果輸入的格式不是標準格式,則同樣需要使用strptime函式,利用format來進行指定;

> mydate <- as.POSIXlt('2017-4-19 7:01:00')
> mydate
[1] "2017-04-19 07:01:00 CST"
> class(mydate)
[1] "POSIXlt" "POSIXt" 
> mydate <- as.POSIXct('2017-4-19 7:01:00')
> mydate
[1] "2017-04-19 07:01:00 CST"
> class(mydate)
[1] "POSIXct" "POSIXt"



另外,形式as.POSIXct(x, origin) 返回自引數origin起的第幾秒。如as.POSIXct(1488522386, origin=”1970-01-01 00:00:00”)的返回結果為”2017-03-03 14:26:26 CST”,該用法可用於將UNIX時間轉為R中的時間。(本段 2017-03-03補充)

> as.POSIXct(1488522386, origin="1970-01-01 00:00:00")
[1] "2017-03-03 14:26:26 CST"
  • strptime與strftime
    strftime(x, format = “”, tz = “”, usetz = FALSE, …)
    strptime(x, format, tz = “”)

format引數在strptime中為必選,在strftime中為可-1選
strptime強制包含時區,而strftime預設不設定時區。如果strftime設定usetz=TRUE,輸出結果就和strptime一樣(資料型別除外)
strptime得到的是時間型別資料,strftime得到字串。

> mydate <- strptime("30-01-2017", format = "%d-%m-%Y")
> mydate
[1] "2017-01-30 CST"
> class(mydate)
[1] "POSIXlt" "POSIXt" 

> mydate <- strptime("20170130120005", format = "%Y%m%d%H%M%S")
> mydate
[1] "2017-01-30 12:00:05 CST"
> class(mydate)
[1] "POSIXlt" "POSIXt" 
> mydate <- strftime("2017-01-30", format = "%d-%m-%Y")
> mydate
[1] "30-01-2017"
> class(mydate)
[1] "character"

注:strptime函式使用的是內部C語言函式轉換字串為時間
而strftime本質上是字串格式化函式,先用as.POSIXlt將字串轉為時間,然後用format函式輸出字串
至於format引數,strftime雖然最終使用了strptime,但format引數並沒有傳遞下去,而是作為format函式的引數,用於 格式化輸出字串

4. 日期/時間的算術運算

  • 求日期差
> today <- Sys.Date()
> gtd <- as.Date("2017-01-01")   
> today - gtd

Time difference of 57 days
> gtd <- as.Date("2017-03-01")   
> today - gtd
Time difference of -2 days
  • difftime()函式
    用difftime()函式可以計算相關的秒數、分鐘數、小時數、天數、週數
> now <- Sys.time()
> myTime <- strptime("2017-02-01 12:00:08", format = "%Y-%m-%d %H:%M:%S")
> difftime(now, myTime)
Time difference of 25.95226 days

> difftime(now, myTime, units = "weeks")
Time difference of 3.707466 weeks

> difftime(now, myTime, units = "days")
Time difference of 25.95226 days

> difftime(now, myTime, units = "hours")
Time difference of 622.8543 hours

> difftime(now, myTime, units = "mins")
Time difference of 37371.26 mins

> difftime(now, myTime, units = "secs")
Time difference of 2242275 secs

5. 其他日期相關函式

weekdays()取日期物件所處的周幾;
months()取日期物件的月份;
quarters()取日期物件的季度;

> mydate <- Sys.Date()
> mydate
[1] "2017-02-27"

> weekdays(mydate)
[1] "星期一"

> months(mydate)
[1] "二月"

> quarters(mydate)
[1] "Q1"