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


R strptime 與字符之間的日期時間轉換函數


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

說明

在字符表示和表示日曆日期和時間的 "POSIXlt""POSIXct" 類的對象之間進行轉換的函數。

用法

## S3 method for class 'POSIXct'
format(x, format = "", tz = "", usetz = FALSE, ...)
## S3 method for class 'POSIXlt'
format(x, format = "", usetz = FALSE,
       digits = getOption("digits.secs"), ...)

## S3 method for class 'POSIXt'
as.character(x, digits = if(inherits(x, "POSIXlt")) 14L else 6L,
             OutDec = ".", ...)

strftime(x, format = "", tz = "", usetz = FALSE, ...)
strptime(x, format, tz = "")

參數

x

要轉換的對象: strptime 的字符向量,可以轉換為 strftime"POSIXlt" 的對象。

tz

指定用於轉換的時區的字符串。係統特定(請參閱 as.POSIXlt ),但 "" 是當前時區,"GMT" 是 UTC。無效值通常被視為 UTC,在某些平台上會出現警告。

format

一個字符串。如果任何元素具有非午夜的時間分量,則 format 方法的默認值為 "%Y-%m-%d %H:%M:%S",否則為 "%Y-%m-%d"。如果設置了options("digits.secs"),則將在幾秒內打印指定的位數。

...

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

usetz

合乎邏輯的。時區縮寫是否應該附加到輸出中?這是在打印時使用的,比使用 "%Z" 更可靠。

digits

需要時確定秒數的 format() 整數。請注意,format()as.character() 的默認值有意不同,as.character() 與數字一樣接近完全準確。

OutDec

指定要使用的小數點的 1 個字符的字符串;默認值不是故意的getOption("OutDec")

細節

formatas.character 方法以及 strftime 將對象從類 "POSIXlt""POSIXct" 轉換為 character 向量。

strptime 將字符向量轉換為類 "POSIXlt" :其輸入 x 首先由 as.character 轉換。每個輸入字符串都會根據指定的格式進行必要的處理:任何尾隨字符都會被忽略。

strftime是一個包裝器format.POSIXlt,並且它和format.POSIXct首先轉換為類"POSIXlt"通過調用as.POSIXlt(所以他們也為類工作"Date")。請注意,隻有該轉換取決於時區。自從R版本4.2.0,as.POSIXlt()轉換現在處理非有限數字-Inf,Inf,NANaN不同的是(以前所有的都被視為NA)。還有format()方法用於POSIXlt現在將這些不同的非有限時間和日期視為類似於類型double.

通常的向量回收規則適用於 xformat,因此答案將是這些向量中較長者的長度。

在適當且可用的情況下使用 Locale-specific 與字符串之間的轉換。這會影響日期和月份的名稱、AM/PM 指示器(如果使用)以及輸出格式中的分隔符,例如%x%X,通過的設置LC_TIME語言環境類別。說明的“當前區域設置”可能意味著在開始時使用的區域設置R會話或首次使用這些函數時。 (對於輸入,locale-specific 轉換可以通過調用來更改Sys.setlocale有類別LC_TIME(或者LC_ALL)。對於輸出,發生的情況取決於操作係統,但通常有效。)

格式的詳細信息是特定於平台的,但以下內容可能會廣泛使用:大多數是由 POSIX 標準定義的。轉換規範由 % 引入,通常後跟一個字母或 OE 後跟一個字母。格式字符串中不屬於轉換規範的任何字符均按字麵解釋(並且 %% 給出 % )。廣泛實施的轉換規範包括

%a

該平台當前區域設置中工作日的縮寫名稱。 (還匹配輸入的全名:在某些語言環境中沒有名稱縮寫。)

%A

當前區域設置中的完整工作日名稱。 (也匹配輸入上的縮寫名稱。)

%b

該平台當前區域設置中月份名稱的縮寫。 (還匹配輸入的全名:在某些語言環境中沒有名稱縮寫。)

%B

當前區域設置中的完整月份名稱。 (也匹配輸入上的縮寫名稱。)

%c

日期和時間。輸出為Locale-specific,輸入為"%a %b %e %H:%M:%S %Y"

%C

世紀(00-99):年份的整數部分除以100。

%d

十進製數形式的月份日期 (01-31)。

%D

日期格式,例如 %m/%d/%y :C99 標準表示它應該是這種確切的格式(但並非所有操作係統都遵守)。

%e

十進製數 (1-31) 表示的月份中的日期,前導空格表示 single-digit 數字。

%F

相當於 %Y-%m-%d(ISO 8601 日期格式)。

%g

基於周的年份的最後兩位數字(請參閱 %V )。 (已接受但在輸入時被忽略。)

%G

以周為單位的年份(請參閱 %V )為十進製數。 (已接受但在輸入時被忽略。)

%h

等效於 %b

%H

十進製數形式的小時 (00-23)。作為特殊的異常字符串,例如‘⁠24:00:00⁠’ 被接受作為輸入,因為 ISO 8601 允許這些。

%I

十進製數形式的小時 (01-12)。

%j

十進製數形式的一年中的日期 (001-366): 對於輸入,366 僅在閏年有效。

%m

十進製數形式的月份 (01-12)。

%M

分鍾為十進製數 (00-59)。

%n

輸出換行,輸入任意空格。

%p

區域設置中的 AM/PM 指示器。與 %I 結合使用,而不是與 %H 結合使用。某些語言環境中的空字符串(例如,在某些操作係統、包括俄羅斯在內的非英語歐洲語言環境中)。如果用於此類區域設置中的輸入,則行為未定義。

某些平台接受 %P 進行輸出,它使用小寫版本( %p 也可能使用小寫):其他平台將輸出 P

%r

對於輸出,12 小時時鍾時間(使用區域設置的 AM 或 PM):僅在某些區域設置中定義,並且在未定義 AM/PM 指示符的區域設置中的某些操作係統上會產生誤導。對於輸入,相當於 %I:%M:%S %p

%R

等效於 %H:%M

%S

第二個為整數 (00-61),最多允許兩個 leap-seconds(但 POSIX-compliant 實現將忽略閏秒)。

%t

輸出上使用製表符,輸入上使用任意空格。

%T

等效於 %H:%M:%S

%u

十進製數形式的工作日(1-7,星期一為 1)。

%U

一年中的第幾周,以十進製數 (00-53) 表示,使用星期日作為一周的第一天(通常將一年中的第一個星期日作為第一周的第一天)。美國大會。

%V

一年中的第幾周,采用 ISO 8601 中定義的十進製數 (01-53)。如果包含 1 月 1 日的周(從星期一開始)在新的一年中有四天或更多天,則將其視為第 1 周。否則,將其視為第 1 周。上一年的最後一周,下一周是第一周。(接受但忽略輸入。)

%w

工作日為十進製數(0-6,星期日為 0)。

%W

一年中的第幾周,以十進製數 (00-53) 表示,使用星期一作為一周的第一天(通常將一年中的第一個星期一作為第一周的第一天)。英國大會。

%x

日期。輸出為Locale-specific,輸入為"%y/%m/%d"

%X

時間。輸出為Locale-specific,輸入為"%H:%M:%S"

%y

無世紀的年份 (00-99)。輸入時,值 00 到 68 以 20 為前綴,69 到 99 以 19 為前綴 - 這是 2018 POSIX 標準指定的行為,但它也表示“預計在未來版本中,默認世紀從 2 推斷” -數字年份將會改變'。

%Y

年與世紀。請注意,雖然原始公曆中沒有零,但 ISO 8601:2004 將其定義為有效(解釋為 1BC):請參閱 https://en.wikipedia.org/wiki/0_(year) 。然而,該標準還規定,其曆法中1582年之前的年份隻能在相關各方同意的情況下使用。

對於輸入,僅接受年份0:9999

%z

與 UTC 的小時和分鍾的有符號偏移量,所以-0800比 UTC 晚 8 小時。 (標準僅適用於輸出。適用於輸入R目前在所有平台上都支持它 - 值來自-1400+1400被接受。)

%Z

(僅輸出。)時區縮寫為字符串(如果不可用則為空)。當時區縮寫多年來發生變化時,這可能不可靠。

顯示前導零的地方將在輸出中使用,但在輸入中是可選的。名稱在輸入時匹配 case-insensitively:輸出時名稱是否大寫取決於平台和區域設置。請注意,縮寫名稱是特定於平台的(盡管標準在‘⁠C⁠' 語言環境 它們必須是大寫英文名稱的前三個字母:此約定廣泛用於 English-language 語言環境,但例如法語月份縮寫在 Linux、macOS、Solaris 和 Windows 中的任何兩個上都不相同)。如果您想使用縮寫,那麽了解縮寫至關重要%a,%b或者%h作為輸入格式的一部分:請參閱示例以了解如何檢查。

%z%Z 用於具有指定時區的對象的輸出時,係統會嘗試使用該時區的值 — 但不保證成功。

%n%t 的 ‘whitespace’ 的定義取決於平台:對於大多數來說,它不包含不間斷空格。

不在標準中且實施較少的是

%k

24 小時製時間,單位數字前麵有一個空格。

%l

12 小時製時間,單位數字前麵有一個空格。

%s

(僅限輸出。)自紀元以來的秒數。

%+

(僅輸出。)類似於 %c ,通常是 "%a %b %e %H:%M:%S %Z %Y" 。可能取決於區域設置。

對於輸出,還有%O[dHImMUVwWy],它可以以替代的locale-dependent格式(例如,羅馬數字)發出數字,以及%E[cCyYxX],它可以使用替代的‘era’(例如,不同的宗教日曆)。其中受支持的是OS-dependent。這些被接受作為輸入,但具有標準解釋。

具體到R%OSn,對於輸出,將秒數截斷為0 <= n <= 6小數位(如果%OS後麵沒有數字,它使用的設置getOption("digits.secs"),或者如果未設置,n = 0)。進一步地,對於strptime %OS將輸入秒,包括秒的小數部分。注意%S不讀取輸出的小數部分。

其他轉換規範的行為(即使以 % 開頭的其他字符序列是轉換規範)是特定於係統的。某些係統記錄不支持在 format 中使用多字節字符:UTF-8 語言環境不太可能導致問題。

format 方法和 strftime 返回表示時間的字符向量。 NA 時間返回為 NA_character_

strptime將字符表示形式轉換為類的對象"POSIXlt"。時區用於設置isdst組件並設置"tzone"屬性如果tz != ""。如果指定的時間無效(例如‘⁠“2010-02-30 08:00”⁠’)結果的所有組成部分都是NA。 (注意:這確實意味著它所說的 - 如果它是一個無效時間,而不僅僅是某個時區中不存在的時間。)

印刷年限

每個人都同意從 1000 到 9999 的年份應該用 4 位數字打印,但標準沒有定義在該範圍之外要做什麽。對於 0 到 999 年,大多數操作係統都會用零或空格填充 4 個字符,但 Linux/glibc 隻輸出數字。

操作係統設施可能不會打印 1 CE(又名 1 AD)之前的年份‘correctly’(它們傾向於假設存在 0 年:請參閱https://en.wikipedia.org/wiki/0_(year),有些操作係統完全錯誤)。常見格式為 -45-045

9999之後和-999之前的年份通常打印有五個或更多字符。

某些平台支持 POSIX 2008(及其他平台)的修飾符。在 Linux/glibc 上的格式"%04Y"確保至少四個字符和零填充(默認為無填充)。內部代碼(在 Windows 上使用,在 macOS 上默認使用)默認使用零填充(這可以通過環境變量控製)R_PAD_YEARS_BY_ZERO)。在這些平台上,格式%04Y,%_4Y%_Y可分別用於零、空格和無填充。 (在 macOS 上,本機代碼(非默認)不支持這些,並使用零填充到 4 位數字。)

時區偏移

與 GMT(也稱為 UTC)的偏移是時區之間以及與 "POSIXct" 類之間轉換的一部分,但會造成困難,因為它們通常計算不正確。

它們通常具有與時區規範相反的符號(請參閱Sys.timezone):正值位於子午線以東。盡管有些時區存在偏移量,如 +00:09:21(1900 年的巴黎)和 -00:44:30(利比裏亞,直到 1972 年),但偏移量通常被視為整數分鍾,並且最常見於RFC 5322 電子郵件標頭采用 -0800 等形式(例如,冬季在美國太平洋海岸使用)。

格式 %z 可用於輸入或輸出:它是一個字符串,通常是加號或減號,後跟兩位數字表示小時,兩位數字表示分鍾:標準規定,如果偏移量不確定,則應輸出空字符串,但是某些係統使用 +0000 或當年使用的時區的偏移量。 (在某些平台上,轉換為 "POSIXct" 後效果更好。某些平台僅識別小時或 half-hour 輸出偏移量。)

使用 %z 作為輸入對於 tz = "UTC" 最有意義。

來源

輸入使用 POSIX 函數 strptime 並輸出 C99 函數 strftime

然而,並非所有操作係統(尤其是 Windows)都提供strptime那些這樣做的人發現了很多問題,所以自 2000 年以來R使用了來自‘的代碼分支⁠glibc⁠’。分叉的代碼使用係統的strftime查找 locale-specific 日期和月份名稱以及任何 AM/PM 指示器。

在某些平台上(包括 Windows,默認情況下在 macOS 上)係統的strftime被 IANA 修改的代碼替換(以及 C-level 日期時間代碼的大部分其餘部分)⁠tzcode⁠' 分配 (https://www.iana.org/time-zones)。

請注意,由於 strftime 用於輸出(而不是 wcsftime ),因此如果需要將參數 format 轉換為會話編碼。

注意

默認格式遵循 ISO 8601 國際標準的規則,該標準將一天表示為"2001-02-28"和一個時間"14:01:02"像這裏一樣使用前導零。 (ISO 形式不使用空格,可能是‘⁠T⁠’,分隔日期和時間:R默認情況下使用空格。)

對於strptime,輸入字符串不需要完全指定日期:假設未指定的秒、分鍾或小時為零,未指定的年、月或日為當前。 (但是,如果指定了月份,則該月的日期必須由 %d%e 指定,因為該月的當前日期不必對於指定的月份有效。)某些組件可能會返回為 NA(但未知的tzone組件由空字符串表示)。

如果指定的時區在您的係統上無效,則發生的情況是特定於係統的,但可能會被忽略。

請記住,在大多數時區,由於與“夏令時”(也稱為‘summer’)時間的轉換,有些時間不會發生,有些時間會發生兩次。 strptime 不會驗證此類時間(它不假定特定時區),但 as.POSIXct 的轉換會驗證此類時間。 strftime 的轉換和格式化/打印使用操作係統設施,並且可能會在 DST 轉換時返回不存在的時間的無意義結果。

在 C 語言環境中%c必須是"%a %b %e %H:%M:%S %Y"。由於 Windows 不符合規定(並且使用北美以外地區無法理解的日期格式),因此該格式被使用R在 Windows 上的所有語言環境中。

生成的每個字符串的長度限製為 2048 個字節strftimeformat方法。來自R4.3.0 嘗試超過此值是一個錯誤(以前的版本會默默地截斷為 255 字節)。

例子


## locale-specific version of date()
format(Sys.time(), "%a %b %d %X %Y %Z")

## time to sub-second accuracy (if supported by the OS)
format(Sys.time(), "%H:%M:%OS3")

## read in date info in format 'ddmmmyyyy'
## This will give NA(s) in some non-English locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- strptime(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
z
(chz <- as.character(z)) # same w/o TZ
## *here* (but not in general), the same as format():
stopifnot(exprs = {
     identical(chz, format(z))
     grepl("^1960-0[137]-[03][012]$", chz[!is.na(z)])
})

## read in date/time info in format 'm/d/y h:m:s'
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")
x <- paste(dates, times)
z2 <- strptime(x, "%m/%d/%y %H:%M:%S")
z2 
## *here* (but not in general), the same as format():
stopifnot(identical(format(z2), as.character(z2)))

## time with fractional seconds
z3 <- strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS") 
z3 # prints without fractional seconds by default, digits.sec = NULL ("= 0")
op <- options(digits.secs = 3)
z3 # shows the 3 extra digits
as.character(z3) # ditto
options(op)

## time zone names are not portable, but 'EST5EDT' comes pretty close.
z4 <- strptime(c("2006-01-08 10:07:52", "2006-08-07 19:33:02"),
               "%Y-%m-%d %H:%M:%S", tz = "EST5EDT")
z4 
attr(z4, "tzone")
as.character(z4)
z4$sec[2] <- pi # "very" fractional seconds
as.character(z4) # shows full precision
format(z4) # no fractional sec
format(z4, digits=8) # shows only 6  (hard-wired maximum)
format(z4, digits=4)


## An RFC 5322 header (Eastern Canada, during DST)
## In a non-English locale the commented lines may be needed.

## prev <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
strptime("Tue, 23 Mar 2010 14:36:38 -0400", "%a, %d %b %Y %H:%M:%S %z")
## Sys.setlocale("LC_TIME", prev)

## Make sure you know what the abbreviated names are for you if you wish
## to use them for input (they are matched case-insensitively):
format(s1 <- seq.Date(as.Date('1978-01-01'), by = 'day',   len =  7), "%a")
format(s2 <- seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b")

## Non-finite date-times :
format(as.POSIXct(Inf)) # "Inf"  (was  NA  in R <= 4.1.x)
format(as.POSIXlt(c(-Inf,Inf,NaN,NA))) # were all NA

參考

International Organization for Standardization (2004, 2000, ...) ‘ISO 8601. Data elements and interchange formats - Information interchange - Representation of dates and times.’, slightly updated to International Organization for Standardization (2019) ‘ISO 8601-1:2019. Date and time - Representations for information interchange - Part 1: Basic rules’, and further amended in 2022. For links to versions available on-line see (at the time of writing) https://dotat.at/tmp/ISO_8601-2004_E.pdf and https://www.qsl.net/g1smd/isopdf.htm; for information on the current official version, see https://www.iso.org/iso/iso8601 and https://en.wikipedia.org/wiki/ISO_8601.

The POSIX 1003.1 standard, which is in some respects stricter than ISO 8601.

也可以看看

DateTimeClasses 了解日期時間類的詳細信息; locales 查詢或設置區域設置。

您的係統幫助頁麵strftime 可以查看如何指定其格式。 (在某些係統上,包括 Windows,strftime 被更全麵的內部代碼取代。)

相關用法


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