當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R DateTimeClasses 日期時間類


R語言 DateTimeClasses 位於 base 包(package)。

說明

表示日曆日期和時間的類 "POSIXlt""POSIXct" 的說明。

用法

## S3 method for class 'POSIXct'
print(x, tz = "", usetz = TRUE, max = NULL, ...)

## S3 method for class 'POSIXct'
summary(object, digits = 15, ...)

time + z
z + time
time - z
time1 lop time2

參數

x , object

要從日期時間類之一打印或匯總的對象。

tz , usetz

對於時區格式,傳遞給 format.POSIXct

max

numeric 或 NULL ,指定要打印的最大條目數。默認情況下,當 NULLgetOption("max.print") 時使用。

digits

計算的有效位數:應該足夠高以準確表示最不重要的時間單位。

...

從其他方法傳遞或向其他方法傳遞的進一步參數。

time

日期時間對象

time1 , time2

日期時間對象或字符向量。 (字符向量由 as.POSIXct 轉換。)

z

數值向量(以秒為單位)

lop

==!=<<=>>= 之一。

細節

有兩類基本的日期/時間。類 "POSIXct" 表示自 1970 年初(UTC 時區)以來的(有符號)秒數,作為數值向量。類 "POSIXlt" 內部是向量的 list,其組件名為 secminhour 表示時間, mdaymonyear 表示日期; wdayyday 表示星期幾和一年中的某一天, isdst ,夏令時標誌,有時(均為可選) zone ,表示時區的字符串,以及 gmtoff ,與 GMT 的偏移量(以秒為單位),請參閱下麵的“POSIXlt 詳細信息”部分了解更多詳細信息。

這些類對應於“日曆時間”的 POSIX/C99 結構(time_t數據類型,“ct”)和“本地時間”(或broken-down時間,“⁠結構tm⁠’數據類型,“lt”),它們也繼承了它們的名稱。

"POSIXct" 更方便包含在數據幀中,而 "POSIXlt" 更接近人類可讀的形式。存在一個虛擬類"POSIXt",這兩個類都從該虛擬類繼承:它用於允許諸如減法之類的操作來混合這兩個類。

這兩個類都可以進行邏輯比較和一些算術運算。可以在日期時間對象中添加或減去秒數,但不能添加兩個日期時間對象。兩個日期時間對象相減相當於使用 difftime 。請注意,除非指定時區,否則 "POSIXlt" 對象將被解釋為位於這些操作的當前時區。

這兩個類都可能有一個屬性 "tzone" ,指定時區。但請注意,它們的含義有所不同,請參閱下麵的“時區”部分了解更多詳細信息。

不幸的是,時區和閏秒的操作使轉換變得複雜(根據這個版本)R的數據,到目前為止 27 天已經有 86401 秒長,最後一次是在(實際上是之前)2017-01-01:額外秒數的時間在對象中.leap.seconds)。如果可能的話,此細節將委托給操作係統服務。似乎一些罕見的係統曾經使用閏秒,但所有已知的當前平台都忽略它們(按照 POSIX 的要求)。這是在構建時檢測到並糾正的,所以"POSIXct"使用次數R在任何平台上都不包括閏秒。

"POSIXlt" 對象上使用 c 會將它們轉換為當前時區,在 "POSIXct" 對象上使用 "tzone" 屬性(如果它們不相同)。

有幾次有具體問題。首先,忽略閏秒,而實時時間例如"2005-12-31 23:59:60"(可能)被視為下一秒。然而,它們永遠不會由R,並且不太可能作為輸入出現。其次,在某些操作係統上,POSIX/C99 標準存在問題"1969-12-31 23:59:59 UTC",即-1在日曆時間中,該值在那些操作係統上也用作錯誤代碼。因此as.POSIXct("1969-12-31 23:59:59", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")可能會給NA, 因此as.POSIXct("1969-12-31 23:59:59", tz = "UTC")會給"1969-12-31 23:59:00"。其他操作係統(包括使用的代碼R在 Windows 上)單獨報告錯誤,因此能夠將該時間視為有效時間。

打印方法遵循 options("max.print")

時區

"POSIXlt"對象通常有一個屬性"tzone",長度為 3 的字符向量,給出時區名稱(來自TZ環境變量或參數tz的函數創建"POSIXlt"物體;""標記當前時區)以及基準時區和備用(夏令時)時區的名稱。有時這可能隻是長度為一,給出base timezones姓名。

"POSIXct" 對象還可以具有屬性 "tzone" ,即長度為 1 的字符向量。如果設置為非空值,它將確定如何將對象轉換為類"POSIXlt",特別是如何打印它。這通常是可取的,但如果您想指定特定時區的對象但要在當前時區打印,您可能需要刪除 "tzone" 屬性。

有關 POSIXlt 的詳細信息

"POSIXlt" 內部是一個名為 list 的向量,表示 date-times,具有以下列表組件

sec

0-61:秒,允許閏秒。

min

0-59:分鍾。

hour

0-23:小時。

mday

1-31:一月中的某一天

mon

0-11:年初之後的幾個月。

year

自 1900 年以來。

wday

每周 0-6 天,從周日開始。

yday

0-365:一年中的第幾天(365 僅適用於閏年)。

isdst

夏令時標誌。如果有效則為正值,如果無效則為零,如果未知則為負值。

zone

(可選。)當時有效的時區縮寫:""(如果未知)(但 "" 也可能用於 UTC)。

gmtoff

(可選。)與 GMT 的偏移量(以秒為單位):正值表示子午線以東。通常NA表示未知,但0可能表示未知。

組件必須按此順序排列:在之前僅進行了最低程度的檢查R4.3.0。所有對象創建於R4.3.0有可選組件。從早期版本R,最後兩個組件在 UTC 中不會出現,並且依賴於平台。現在gmtoff幾乎所有當前平台上都有設置:基於 BSD 或glibc(包括 Linux 和 macOS)以及使用tzcode實施附帶R(包括 Windows 和默認的 macOS)。

請注意,內部列表結構有些隱藏,因為許多方法(包括 length(x)print()str() )適用於抽象日期時間向量,就像 "POSIXct" 一樣。可以通過具有兩個索引的 [ 索引來提取和替換單個組件(請參閱示例)。

"POSIXlt" 的分量是 integer 向量,除了 sec ( double ) 和 zone ( character )。然而,大多數用戶會將第一個條的數值強製為實數,並將其餘條zone強製為整數。

組件 wdayyday 僅供參考,不用於轉換為日曆時間,也不用於打印 format()as.character()

然而,需要組件 isdst 來區分 DST 結束時的時間:通常淩晨 1 點到淩晨 2 點會出現兩次,第一次在 DST 中,然後在標準時間中。在所有其他時間,isdst 都可以從前六個值推斷出來,但如果設置不正確,則行為取決於平台。例如,Linux/glibc 在檢查時修複了支持 DST 的時區中的錯誤值,但在沒有 DST 的時區中給出了 1 值錯誤。

對於 “ragged” 和超出範圍與 “balanced” "POSIXlt" 對象,請參閱 balancePOSIXlt()

Sub-second 準確度

"POSIXct""POSIXlt" 能夠表達秒的幾分之一,後者允許更高的精度。因此,兩種形式之間的分數轉換可能不準確,但精度優於微秒。

僅當設置了 options("digits.secs") 時才打印秒小數部分:請參閱 strftime

時間的有效範圍

"POSIXlt" 類可以表示非常廣泛的時間(最多數十億年),但此類時間隻能參考時區來解釋。

時區的概念最早於 19 世紀被采用,公曆於 1582 年引入,但直到 1927 年才得到普遍采用。操作係統服務幾乎總是采用公曆,並且可能假定該位置首次製定的時區於該日期之前生效。 (最早的立法時區似乎是 1847 年 12 月 1 日的倫敦。)一些操作係統根據時區內某個位置的經度假定以前使用的“本地時間”。

大多數操作係統將 POSIXct 表示為 C 類型 long 。這意味著在 32 位操作係統上,這涵蓋了 1902 年到 2037 年期間。在所有已知的 64 位平台上以及我們在 32 位 Windows 上使用的代碼,可表示時間的範圍是數十億年:但是,並非所有平台都可以正確轉換 1902 年之前或 2037 年之後的時間。一些愚昧的操作係統使用無符號類型,因此無法表示 1970 年之前的時間。

在可能的情況下檢測平台限製,並且在限製之外我們使用我們自己的 C 代碼。這使用 1902 年使用的 GMT 偏移量(當時沒有 DST)或預測的 2030 年至 2037 年之一(選擇以便可能的 DST 過渡日為星期日),並使用備用(夏令時)時間僅當 isdst 為正時或(如果 -1 )如果預計 DST 將於當天在 2030 年代開始運行,則區域。

請注意,有些地方(例如羅馬)與 UTC 的偏移量在 1902 年之前的年份中有所不同,並且隻有在操作係統支持的情況下才能正確處理這些情況。

沒有理由認為 DST 規則在未來將保持不變:美國於 2005 年立法,從 2007 年起更改其規則,未來可能會恢複原樣。因此,未來一兩年以上的轉換是推測性的。其他國家/地區已在提前幾天通知後更改了其規則(事實上,如果使用夏令時)。因此,未來日期的表示和轉換是暫定的。這也適用於時區數據庫 in-use 版本之後的日期 - 並非所有平台都會使其保持最新,其中包括舊版本的R使用地點(Windows 和 macOS 上默認使用)。

警告

一些Unix-like係統(尤其是Linux係統)沒有環境變量TZ設置,但有內部代碼期望它(就像 POSIX 一樣)。我們已嘗試解決此問題,但如果您得到意外結果,請嘗試設置TZ.看Sys.timezone以獲得有效的設置。

比較 "POSIXlt" 類的對象時需要非常小心。組件和屬性不僅是可選的,而且是可選的。幾個組件可能具有“尚未確定”的值,並且在不同時區表示的同一時間看起來會完全不同。

"POSIXlt" 對象的列表組件的順序不得更改,因為一些基於 C 的轉換方法依賴於順序來提高效率。

例子

## IGNORE_RDIFF_BEGIN
(z <- Sys.time())             # the current date, as class "POSIXct"

Sys.time() - 3600             # an hour ago

as.POSIXlt(Sys.time(), "GMT") # the current time in GMT
format(.leap.seconds)         # the leap seconds in your time zone
print(.leap.seconds, tz = "PST8PDT")  # and in Seattle's
## IGNORE_RDIFF_END

## look at *internal* representation of "POSIXlt" :
leapS <- as.POSIXlt(.leap.seconds)
names(unclass(leapS)) ; is.list(leapS)
## str() on inner structure needs unclass(.):
utils::str(unclass(leapS), vec.len = 7)
## show all (apart from "tzone" attr):
data.frame(unclass(leapS))

## Extracting *single* components of POSIXlt objects:
leapS[1 : 5, "year"]
leapS[17:22, "mon" ]

##  length(.) <- n   now works for "POSIXct" and "POSIXlt" :
for(lpS in list(.leap.seconds, leapS)) {
    ls <- lpS; length(ls) <- 12
    l2 <- lpS; length(l2) <- 5 + length(lpS)
    stopifnot(exprs = {
      ## length(.) <- * is compatible to subsetting/indexing:
      identical(ls, lpS[seq_along(ls)])
      identical(l2, lpS[seq_along(l2)])
      ## has filled with NA's
      is.na(l2[(length(lpS)+1):length(l2)])
    })
}

參考

Ripley, B. D. and Hornik, K. (2001). “Date-time classes.” R News, 1(2), 8-11. https://www.r-project.org/doc/Rnews/Rnews_2001-2.pdf.

也可以看看

Dates 適用於沒有時間的日期。

as.POSIXctas.POSIXlt 用於類之間的轉換。

strptime 用於與字符表示形式之間的轉換。

Sys.time 將時鍾時間作為 "POSIXct" 對象。

difftime 用於時間間隔。

balancePOSIXlt() 用於平衡或填充 “ragged” POSIXlt 對象。

cut.POSIXtseq.POSIXtround.POSIXttrunc.POSIXt 用於這些類的方法。

weekdays 方便提取函數。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Date-Time Classes。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。