R學習 第八篇:日期和時間

R語言的基礎包中提供了三種基本類型用於處理日期和時間,Date用於處理日期,它不包括時間和時區信息;POSIXct/POSIXlt用於處理日期和時間,其中包括了日期、時間和時區信息。R內部在存儲日期和時間時,使用不一樣的方式:html

  • Date類:存儲了從1970年1月1日以來開始計算的天數,更早的日期表示爲負值,也就是說,Date類型是一個整數,以天爲單位來計算日期,所以,Date適合用於計算日期。
  • POSIXct類:記錄了以時間標準時間(UTC)時區位準的,從1970年1月1日開始計時的秒數,即,POSIXct類型是整數,以秒爲單位來計算時間,所以,POSIXct最適合用於存儲和計算時間。
  • POSIXlt類:把日期和時間存儲爲一個列表,其中包括秒、分、時和月份等,POSIXlt是使用列表來表示日期和時間,所以,POSIXlt最適合用於提取日期中的特定部分。

通常來說,R語言中建立的時間數據是經過字符型轉化而來,字符串和時間類型沒法隱式轉換,必須經過相應的函數來類解析文本。web

一,系統當前的日期和時間

在編程中,爲了得到當前的日期和時間,有兩個經常使用的函數,這兩個函數以Sys開頭,返回的時間受到操做系統區域設置的影響,所以,返回的時間採用本地格式,符合本地的閱讀習慣:編程

> Sys.Date()
[1] "2018-05-07"
> Sys.time()
[1] "2018-05-07 22:11:45 CST"

R還有一個函數date(),用於返回當前時間對應的文本,只不過格式比較奇葩:函數

> date()
[1] "Tue May 08 11:32:52 2018"

二,把文本解析成日期和時間ui

日期值一般以文本的形式輸入到R中,而後轉化爲以數值形式存儲的日期變量。而日期須要轉換爲文本,才方便讀取。spa

1, as.Date() 把文本轉換爲日期操作系統

函數 as.Date()用於把文本轉換爲Date類型:.net

as.Date(x, format)

format參數用於指定輸入的格式,經常使用的日期格式符號是:code

  • %y:兩位數字表示的年份(00-99),不帶世紀,例如,數值是18,格式%y,表示2018年 
  • %Y:四位數字表示的年份(0000-9999)
  • %m:兩位數字的月份,取值範圍是01-12,或1-12
  • %d:月份中的天,取值範圍是01-31
  • %e:月份中的天,取值範圍是1-31
  • %b:縮寫的月份(Jan、Feb、Mar等)
  • %B:英語月份全名(January、February 、March等)
  • %a:縮寫的星期名(Mon、Tue、Wed、Thur、Fri、Sat、Sun)
  • %A:星期全名

例如,把一個向量中的字符元素轉換爲日期類型:orm

as.Date(c('2018-05-01','2018-05-05'),'%Y-%m-%d')

2,strptime() 解析日期

函數strptime(),是string parse time的簡稱,返回POSIXlt日期。在解析日期時,必須指定文本和日期對應的位置,日期的格式使用%+字母來指定。

format(x, format = "", tz = "")

參數tz是時區(time zone),默認值是空,在解析時,若是不指定時區,R會調用Sys.timezone

日期格式和format()函數相同,經常使用的時間格式符號是:

  • %H:小時(24小時制)
  • %I:小時(12小時制)
  • %p:對於12小時制,指定上午(AM)或下午(PM)
  • %M:分鐘
  • %S:秒

例如,把date()函數返回的文本解析成時間類型:

> nowstr <- date()
> nowtime <- strptime(nowstr,'%a %b %d %H:%M:%S %Y')
> print(nowtime)
[1] "2018-05-08 13:01:04 CST"

三,把日期和時間格式化爲文本

把日期和時間格式化成文本,便於閱讀

1,format() 把日期轉換爲文本

對日期進行格式化,轉換爲可讀的文本,format()函數的定義是:

format(x, format = "", tz = "")

x是日期參數,format是輸出的格式,tz是時區,該函數按照指定的格式輸出文本:

today <- Sys.Date()
mydate <- format(today,format='%Y-%m-%d')

2,strftime()格式化日期

函數strftime(),是string formated time的簡稱,用於把時間轉換爲字符串,

strptime(x, format, tz = "")

該函數和format()函數的功能和使用方式幾乎徹底相同。

today <- Sys.Date()
mydate <- strftime(today,format='%Y-%m-%d')

四,日期的比較

因爲POSIXct類是以秒爲單位來計算時間,Date類是以天爲單位類計算日期,這意味着能夠在日期值上執行比較運算和算術運算:

  • 將數字和Date類相加,增長或減小相應的天數
  • 將數字和POSIXct類相加,增長或減小相應的秒數

1,時間和數字相加

時間以秒爲單位:

> time1 <- Sys.time()
> print(time1)
[1] "2018-05-08 13:16:36 CST"
> print(time1+60*60)
[1] "2018-05-08 14:16:36 CST"

日期以天爲單位:

> date1 <- Sys.Date()
> print(date1)
[1] "2018-05-08"
> print(date1+1)
[1] "2018-05-09"

2,時間比較

因爲Date類和POSIXct類實際上都是一個整數,能夠直接比較大小

date1 <- as.Date('2018-01-01')
date2 <- as.Date('2018-02-01')
if (date2>date1) print ('gt')

五,lubridate包介紹

lubridate包使得日期和時間的處理更加規範,簡單和靈活。lubridate中全部解析函數都會返回POSIXct日期,默認都是用UTC時區。

lubridate包主要有兩類函數,一類是處理時點數據(time instants),另外一類是處理時段數據(time spans)。

安裝和載入lubridate包:

install.packages("lubridate")
library(lubridate)

系統的當前時間now(),和Sys.time()函數返回的時間相同;系統的當前日期today(),和Sys.Date()函數返回的日期相同:

now(tzone = "")
today(tzone = "")

1,從字符串轉換爲日期類型

ymd() 函數用於從字符型數據解析時間,該函數會自動識別各類分隔符,函數的定義是:

ymd(..., quiet = FALSE, tz = NULL)

參數註釋:

  • quiet:布爾值,當指定爲TRUE時,移除文本中自定義的文本
  • tz:時區,默認值是NULL

基本用法以下:

x <- ymd('2010-04-08')

而ymd表明文本的格式必須依次是:year、month、day,除了ymd以外,還有ydm、mdy、myd、dmy、dym。

2,從字符類型轉換爲時間類型

ymd_hms()函數用於把文本解析爲時間,該函數會自動識別各類分隔符

ymd_hms(..., quiet = FALSE, tz = "UTC")

3,抽取或設置時間的部分

  • date:抽取或設置時間的日期
  • year
  • month
  • day
  • week
  • hour
  • minute
  • second

例如,抽取當前時間的月份:

> month(t<-now())
[1] 5

例如,設置當前時間的月份爲6月:

x< now()
month(x) <- 6

4,時間間隔(Intervals)

時間間隔是由開始時間和結束時間構成的對象,自己用途不大,最經常使用於指按期間和週期:

auckland <- interval(arrive, leave) 
auckland
#> [1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
auckland <- arrive %--% leave
auckland
#> [1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST

5,時間的運算

lubridata還能建立兩類對象:期間(Duration)和週期(Period),建立period的輔助函數是unit+s,建立duration的輔助函數是d+unit+s,unit是時間單位,經常使用的時間單位有:year、month、week、day、hour、minute和second。期間指定的時間跨度位秒的倍數,是固定的秒數。例如,一天的總時間是86 400秒(60 x 60 x 24),一年的總時間是86 400 x 365 (秒),期間類型把一年的天數固定位365天,沒有考慮閏年。週期period根據日從來指定時間闊度,這意味着,在把週期添加到一個時間以前,period的確切的時間跨度是不固定的。例如,一年的週期能夠是365天,也能夠是366天,這取決於它是不是閏年。時間和日期的算術運算,跟期間和週期有關係,常常用到的是週期period類型。

經常使用的duration類的函數有:

duration(num = NULL, units = "seconds", ...)
is.duration(x)
dseconds(x = 1)
dminutes(x = 1)
dhours(x = 1)
ddays(x = 1)
dweeks(x = 1)
dyears(x = 1)

經常使用的period類的函數有:

period(num = NULL, units = "second", ...)
is.period(x)
seconds(x = 1)
minutes(x = 1)
hours(x = 1)
days(x = 1)
weeks(x = 1)
years(x = 1)
months(x)

注意,duration類沒有dmonths()函數,多是由於月份持續的天數十分不固定,沒法指定一個固定的總時間(秒)。

例1,2分鐘的period和duration分別是:

minutes(2) ## period
#> [1] "2M 0S"
dminutes(2) ## duration
#> [1] "120s (~2 minutes)"

例2,對時間加上期間和週期,返回的結果是不一樣的:

> ymd(20120101) + dyears(1)
[1] "2012-12-31"
> ymd(20120101) + years(1)
[1] "2013-01-01"

例3,日期的下一個月:

ymd('2018-01-01')+months(1)

6,日期週期的開始和結束

使用如下兩個函數得到日期的開始或結束時間:

floor_date(x, unit = "seconds", week_start = getOption("lubridate.week.start", 7))
ceiling_date(x, unit = "seconds", change_on_boundary = NULL, week_start = getOption("lubridate.week.start", 7))

例如,得到YTD的開始和結束日期:

ytd_start <- floor_date(Sys.Date(),'year')
ytd_end <- floor_date(Sys.Date(),'month')

 

 

參考文檔:

Make Dealing with Dates a Little Easier

Do more with dates and times in R

R語言中的時間與日期

R包實踐:lubridate 處理時間數據

時間處理–lubridata包

相關文章
相關標籤/搜索