您好我正在嘗試從以下字串中提取年、月和日期
“2020y 3m 1d 16h”
并希望得到如下輸出:
“2020-03-01”(或“2020-3-1”但日期型別)
我試過搜索谷歌,但只能得到[提取某些模式-其中大多數都有標點符號模式],[提取所有數字-很難洗掉 16 等]。
有人可以幫我解決這個問題嗎?
非常感謝您!
uj5u.com熱心網友回復:
我們可以先從輸入中洗掉“__h”字串,然后使用包中的ymd()函式lubridate將其轉換為日期。
正則運算式:
\\s任何空格(匹配“16h”之前的空格)\\d{1,2}出現 1 到 2 次的任何數字(因為小時的范圍應為 00 到 23 或 24,最多只有兩位數字)
library(lubridate)
ymd(gsub("\\s\\d{1,2}h", "", "2020y 3m 1d 16h"))
[1] "2020-03-01"
class(ymd(gsub("\\s\\d{1,2}h", "", "2020y 3m 1d 16h")))
[1] "Date"
uj5u.com熱心網友回復:
將 y,m,d 字符轉換為短破折號,然后使用 as.POSIXct 轉換為 datetime 類。月份或日期為 10 或以上的空格可能不存在。
as.POSIXct( gsub("[y|m|d]( ){0,1}", "-", test),format="%Y-%m-%d-%Hh")
#[1] "2020-03-01 16:00:00 CST"
這也可以通過以下輸入成功:
test <- "2020y12m 1d 16h"
....而 benson23 的答案失敗了。如果您打算丟棄小時資訊,格式字串可能是:
..., format="%Y-%m-%d"
as.POSIXct( gsub("[y|m|d]( ){0,1}", "-", test),format="%Y-%m-%d")
您通常應該提供更多可能的輸入來支持代碼測驗。
uj5u.com熱心網友回復:
您可以在一個或多個 non-digits 上使用字串ISOdate后使用。strsplit\\D
r1 <- simplify2array(strsplit(x, '\\D ')) |> t() |> as.data.frame() |> unname() |>
do.call(what='ISOdate') |> as.Date()
r1
# [1] "2020-03-01" "2020-12-01" "2020-12-12"
class(r1)
[1] "Date"
如果你不考慮,as.Date你甚至會"POSIXt"隨著時間的推移上課。
r2 <- simplify2array(strsplit(x, '\\D ')) |> t() |> as.data.frame() |> unname() |>
do.call(what='ISOdate')
r2
# [1] "2020-03-01 16:00:00 GMT" "2020-12-01 16:00:00 GMT" "2020-12-12 01:00:00 GMT"
class(r2)
# [1] "POSIXct" "POSIXt"
資料:
x <- c("2020y 3m 1d 16h", "2020y 12m 1d 16h", "2020y 12m 12d 1h")
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464724.html
