我正在从chr转换为POSIXct,格式为"%Y-%m-%d%H:%m:%S但是,数据集中的一些时间没有秒部分(%S(,所以当我转换为DateTime时,没有秒的时间将作为空单元格返回-NA我如何确保这种情况不会发生。我希望它们都作为DateTime返回,不管是否缺少某些时间部分?
这种格式的日期时间("%Y-%m-%d%H:%m:%S"(作为POSIXct 正确返回
但是这种格式的日期时间("%Y-%m-%d%H:%m"(作为NA 返回
这是用于转换的代码trips$ended_at <- as.POSIXct(trips$ended_at, format = "%Y-%m-%d %H:%M:%S")
这是一个庞大的数据集,有超过一百万个条目,所以我甚至不知道哪些日期时间没有秒部分。有没有办法让那些没有秒的部分只能有零和结尾?例如,当转换为POSIXct 时,2020-29-04 01:57将返回为2020-29-04:01:57:00
请帮忙!
两种方法:
-
将文字
:00
连接到只有小时/分钟的时间戳末尾:as.POSIXct(trips$ended_at, format = "%Y-%m-%d %H:%M:%S") # [1] "2020-04-29 01:57:00 EDT" "2020-04-29 01:57:00 EDT" # [3] "2020-04-29 01:57:00 EDT" NA # [5] "2020-04-29 01:57:00 EDT" gsub("( [0-9]+:[0-9]+)$", "\1:00", trips$ended_at) # [1] "2020-04-29 01:57:00" "2020-04-29 01:57:00" "2020-04-29 01:57:00" # [4] "2020-04-29 01:57:00" "2020-04-29 01:57:00" as.POSIXct(gsub("( [0-9]+:[0-9]+)$", "\1:00", trips$ended_at), format = "%Y-%m-%d %H:%M:%S") # [1] "2020-04-29 01:57:00 EDT" "2020-04-29 01:57:00 EDT" # [3] "2020-04-29 01:57:00 EDT" "2020-04-29 01:57:00 EDT" # [5] "2020-04-29 01:57:00 EDT"
-
如果你有多个";候选";需要尝试的格式,您可以迭代地逐步完成它们。这个循环遍历格式,将最可能的候选者放在第一位。如果在任何时候所有时间戳都已转换,则它会提前退出
for
循环。candidates <- c("%Y-%m-%d %H:%M", "%d/%m/%Y %H:%M:%S", "%d/%m/%Y %H:%M") out <- as.POSIXct(trips$ended_at, format = "%Y-%m-%d %H:%M:%S") for (fmt in candidates) { if (!length(isna <- is.na(out))) break out[isna] <- as.POSIXct(trips$ended_at[isna], format = fmt) } out # [1] "2020-04-29 01:57:00 EDT" "2020-04-29 01:57:00 EDT" # [3] "2020-04-29 01:57:00 EDT" "2020-04-29 01:57:00 EDT" # [5] "2020-04-29 01:57:00 EDT"
数据
trips <- data.frame(ended_at = c("2020-04-29 01:57:00", "2020-04-29 01:57:00", "2020-04-29 01:57:00", "2020-04-29 01:57", "2020-04-29 01:57:00"))
这是我采用的方法,在假设您正在处理两种可能性的情况下使用ifelse()
——有秒和没有秒
date_time <- c("2020-01-18 20:12:16", "2020-01-18 20:12")
ifelse(nchar(date_time) == 16,
format(as.POSIXct(date_time, format="%Y-%m-%d %H:%M"), "%Y-%m-%d %H:%M:%S"),
format(as.POSIXct(date_time, format="%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S"))
这是我通常要做的。在通过nchar()
格式化POSIXct之前检查字符串的长度,将结果存储在一个新列中,例如:
trips$check<-nchar(trips$ended_at)
然后检查所有trips$ended_at
是否具有相同的长度,并为没有的人添加缺失的秒数:
trips$ended_at_new<-ifelse(trips$check==19,trips$ended_at,paste(trips$ended_at,":00",sep=""))
您可以将19换成您正在使用的任何日期时间格式。重要提示:只有当时间戳末尾缺少秒时,这才有效,而不是因为任何其他原因导致时间戳长度小于19个字符。