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 |
對於時區格式,傳遞給 |
max |
numeric 或 |
digits |
計算的有效位數:應該足夠高以準確表示最不重要的時間單位。 |
... |
從其他方法傳遞或向其他方法傳遞的進一步參數。 |
time |
日期時間對象 |
time1 , time2 |
日期時間對象或字符向量。 (字符向量由 |
z |
數值向量(以秒為單位) |
lop |
|
細節
有兩類基本的日期/時間。類 "POSIXct"
表示自 1970 年初(UTC 時區)以來的(有符號)秒數,作為數值向量。類 "POSIXlt"
內部是向量的 list
,其組件名為 sec
、 min
、 hour
表示時間, mday
、 mon
和 year
表示日期; wday
、 yday
表示星期幾和一年中的某一天, 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
強製為整數。
組件 wday
和 yday
僅供參考,不用於轉換為日曆時間,也不用於打印 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.POSIXct
和 as.POSIXlt
用於類之間的轉換。
strptime
用於與字符表示形式之間的轉換。
Sys.time
將時鍾時間作為 "POSIXct"
對象。
difftime
用於時間間隔。
balancePOSIXlt()
用於平衡或填充 “ragged” POSIXlt 對象。
cut.POSIXt
、 seq.POSIXt
、 round.POSIXt
和 trunc.POSIXt
用於這些類的方法。
weekdays
方便提取函數。
相關用法
- R Dates 日期類別
- R Defunct 將對象標記為已失效
- R Deprecated 將對象標記為已棄用
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
- R rank 樣本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 將文本推回連接
- R strsplit 分割字符向量的元素
- R seq.Date 生成規則的日期序列
- R invisible 將打印模式更改為不可見
- R noquote “無引號”字符串打印類
- R warning 警告信息
- R rapply 遞歸地將函數應用於列表
- R basename 操作文件路徑
- R with 評估數據環境中的表達式
- R formals 訪問和操縱形式參數
- R icuSetCollate 按 ICU 設置整理
- R search 給出 R 對象的搜索路徑
- R gzcon 通過連接(解)壓縮 I/O
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Date-Time Classes。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。