将字符时间段(格式怪异)转换为R中的日期和时间

将字符时间段(格式怪异)转换为R中的日期和时间,r,R,我有一个格式为“01jan1990凌晨1点到下午2点””的字符向量,我想将其转换为单独的日期和时间,其中时间是范围的开始和结束。到目前为止,我使用了strsplit在“to”处将其分隔,然后尝试在下半部分使用parse_date_time,但我最终得到了类似于0000-01-01 14:00:00 UTC的结果。我甚至不知道如何转换上半场 R中的函数似乎不支持这种格式。我很困惑。任何帮助都将不胜感激从给出的s1输入中删除所有点,然后从给出的s2中删除1am到。现在我们可以将这两个转换为POSIX

我有一个格式为“
01jan1990凌晨1点到下午2点”
”的字符向量,我想将其转换为单独的日期和时间,其中时间是范围的开始和结束。到目前为止,我使用了
strsplit
在“to”处将其分隔,然后尝试在下半部分使用parse_date_time,但我最终得到了类似于
0000-01-01 14:00:00 UTC
的结果。我甚至不知道如何转换上半场


R中的函数似乎不支持这种格式。我很困惑。任何帮助都将不胜感激

从给出的
s1
输入中删除所有点,然后从给出的s2中删除
1am到
。现在我们可以将这两个转换为POSIXct,给出t1和t2,并从中提取日期和时间。对于问题中的输入,我们已经展示了这一点,但如果s是此类输入的特征向量,它将继续工作。没有使用任何软件包

s <- "01jan1990 1 a.m. to 2 p.m"

s1 <- gsub("\\.", "", s)
s2 <- sub("\\d+ \\S+ to ", "", s1)

fmt <- "%d%b%Y %I %p"
t1 <- as.POSIXct(s1, format = fmt)
t2 <- as.POSIXct(s2, format = fmt)

as.Date(t1); as.Date(t2)
## [1] "1990-01-01"
## [1] "1990-01-01"

sub(".* ", "", format(t1)); sub(".* ", "", format(t2))
## [1] "01:00:00" 
## [1] "14:00:00"

s您可以将数据提取到三列中

x <- c("01jan1990 1 a.m. to 2 p.m.", "10jan1990 9 a.m. to 2 p.m.")

data <- strcapture('(\\w+) (\\d+ .\\..)\\. to (\\d+ .\\..)', x,
           proto = list(date = character(), start = character(), end = character()))

data
#       date start   end
#1 01jan1990 1 a.m 2 p.m
#2 10jan1990 9 a.m 2 p.m

太好了,谢谢你。我唯一的问题是最后一行(sub(“*”,”,格式(t1));sub(“*”,”,格式(t2))将时间设置为字符格式。我希望它们都是日期时间对象,以便我可以对它们执行数学运算。是否有一个函数可以使用,类似于as.date函数,但用于时间?t1和t2是日期时间对象。POSIXct对象始终具有日期和时间,而不仅仅是时间;然而,CHRO中的times类是av这就是纯时间:
library(chron);times(sub(“.*”,format(t1));times(sub(“.*”,format(t2))
您也可以决定只存储t1和t2,而不用分别存储日期和时间。如果需要,您可以随时提取它们。
data[-1] <- lapply(data[-1], function(x) as.POSIXct(paste(data$date, 
            sub('.', '', x, fixed = TRUE)), format = '%d%b%Y %I %p', tz = 'UTC'))
data

#       date               start                 end
#1 01jan1990 1990-01-01 01:00:00 1990-01-01 14:00:00
#2 10jan1990 1990-01-10 09:00:00 1990-01-10 14:00:00