首页 > 解决方案 > 如何将特定时间转换为

问题描述

我想将字符串列转换为正确的格式。

通常我会做类似的事情:

print(df$Time) 
> "00:00:01"
as.POSIXct(df$Time,format="%H:%M:%S")

但是,我的数据很奇怪。它看起来像这样:

print(df$Time)
850a"  "823a"  NA      "906a"  "321a"  "1154p"

我的解决方案不起作用。因为我首先剥离了字符(在本例中为“a”和“p”)。但是在这样做之后,我的时间错过了一个重要的部分(如果是早上或下午)。

因此我的问题是:如何将这些数据转换为正确的格式?

预期输出:

df$Time_Old
850a"  "823a"  NA      "906a"  "321a"  "1154p"

df$Time_New
08.50   08.23    NA    09.06   03.21   23.54

一些示例数据:

vector_string <- as.vector(tv_Adds[["Time"]])
vector_string = vector_string[1:20]
> vector_string 


[1] "850a"  "823a"  NA      "906a"  "321a"  "1154p" "608p"  "1012a" "354a"  "1121p" "414p"  "1241p" "721p"  "223p"  "316p" 
[16] "345p"  "1145a" "3p"    "937a"  "138p"

> dput(vector_string[1:20])
c("850a", "823a", NA, "906a", "321a", "1154p", "608p", "1012a", 
"354a", "1121p", "414p", "1241p", "721p", "223p", "316p", "345p", 
"1145a", "3p", "937a", "138p")

标签: rtimedplyrchron

解决方案


您必须将小时与分钟分开,因为您给出的输入是模棱两可的。然后在非 NA 条目的末尾添加“m”。我认为你需要这个:

tvec = c("850a",  "823a",  NA, "906a",  "321a",  "1154p")
notNA <- !is.na(tvec)

#separate hours from minutes with a dot and append m at the end:
tvec[notNA] <- paste0(strtrim(tvec[notNA], nchar(tvec[notNA]) - 3), ".", 
                      substr(tvec[notNA], nchar(tvec[notNA])-2, nchar(tvec[notNA]))
, "m")

as.POSIXct(tvec, format = "%I.%M%p")
[1] "2019-10-25 08:50:00 CEST" "2019-10-25 08:23:00 CEST"
[3] NA                         "2019-10-25 09:06:00 CEST"
[5] "2019-10-25 03:21:00 CEST" "2019-10-25 23:54:00 CEST"

"%I.%M%p"代表

hour(0-12), followed by .,followed by minutes(00-59), followed by "am"(or "pm")


推荐阅读