我有一個包含檔案名的向量:
Filenames = c("blabla_bli_20140524_002532_000.wav",
"20201025_231205.wav",
"ble_20190612_220013_012.wav",
"X-20150312_190225_Blablu.wav",
"0000125.wav")
當然,真正的向量更長。我需要從名稱中提取時間戳,以便以日期格式獲得以下結果:
Result = c("2014-05-24 00:25:32.000",
"2020-10-25 23:12:05.000",
"2019-06-12 22:00:13.012",
"2015-03-12 19:02:25.000",
NA)
請注意,有時字符出現在時間戳之前或之后,并且某些檔案名顯示毫秒,而有些則不顯示(在這種情況下,它們被假定為 000 毫秒)。如果檔案名中沒有時間戳,我還需要獲取類似“NA”的內容。
我在這里找到了一個不錯的解決方案,但它在 python 中,我不知道如何在 R 中翻譯它。我試過這個,但它不起作用:
str_extract(Filenames, regex("_((\d )_(\d ))"))
Error: '\d' is an unrecognized escape in character string starting ""_((\d"
uj5u.com熱心網友回復:
您可以使用gsub
按模式提取日期時間部分,然后(主要)依靠 POSIX 標準對日期時間的決議。唯一的問題是在 POSIX 中,毫秒必須表示為ss.mmm(小數秒),因此您需要將 _ 替換為 .
timestamps <- gsub(".*?(([0-9]{8}_[0-9]{6})(_([0-9]{3}))?).*?$", "\\2.\\4", Filenames)
timestamps
[1] "20140524_002532.000" "20201025_231205." "20190612_220013.012"
[4] "20150312_190225." "0000125.wav"
我們已經捕獲了日期時間部分 ( \\2
),添加了一個點,然后是(可選的)毫秒部分 ( \\4
),沒有下劃線。請注意,不匹配的檔案名保持不變 - 沒關系。
現在我們使用POSIX 規范指定日期時間格式來首先決議字串,然后以不同的格式列印它們:
times <- as.POSIXct(timestamps, format="%Y%m%d_%H%M%OS")
format(times, "%Y-%m-%d %H:%M:%OS3")
[1] "2014-05-24 00:25:32.000" "2020-10-25 23:12:05.000" "2019-06-12 22:00:13.012"
[4] "2015-03-12 19:02:25.000" NA
請注意,不是時間戳的字串剛剛變成了 NA,因此您可以在這里輕松擺脫它。此外,如果您想查看列印出的毫秒數,您可以使用%OS
(小數秒)格式加上您想要列印的位數(0-6) - 在這種情況下,%OS3
.
uj5u.com熱心網友回復:
您可以使用
library(stringr)
rx <- "(\\d{4})(\\d{2})(\\d{2})_(\\d{2})(\\d{2})(\\d{2})(?:_(\\d ))?"
Filenames = c("blabla_bli_20140524_002532_000.wav", "20201025_231205.wav", "ble_20190612_220013_012.wav", "X-20150312_190225_Blablu.wav", "0000125.wav")
m <- str_match(Filenames, rx)
result <- ifelse(is.na(m[,8]),
str_c(m[,2], "-", m[,3], "-", m[,4], " ", m[,5], ":", m[,6], ":", m[,7], ".000"),
str_c(m[,2], "-", m[,3], "-", m[,4], " ", m[,5], ":", m[,6], ":", m[,7], ".", m[,8]))
result
請參閱R 演示。輸出:
> result
[1] "2014-05-24 00:25:32.000"
[2] "2020-10-25 23:12:05.000"
[3] "2019-06-12 22:00:13.012"
[4] "2015-03-12 19:02:25.000"
[5] NA
請參閱正則運算式演示。它將日期時間字串的一部分捕獲到單獨的組中。如果最后一個組((\d )
在(?:_(\d ))?
可選的非捕獲組匹配毫秒中)匹配,我們在它前面添加一個點,否則,我們添加.000
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517291.html
標籤:r正则表达式时间戳