R日期时间序列缺少值



我正在从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

请帮忙!

两种方法:

  1. 将文字: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"
    
  2. 如果你有多个";候选";需要尝试的格式,您可以迭代地逐步完成它们。这个循环遍历格式,将最可能的候选者放在第一位。如果在任何时候所有时间戳都已转换,则它会提前退出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个字符。

最新更新