【问题标题】:Find dates that fail to parse in R Lubridate查找无法在 R Lubridate 中解析的日期
【发布时间】:2016-05-24 00:48:03
【问题描述】:

作为一个 R 新手,我正在努力调试隐秘的 R 错误。我有包含 150k 行的 csv,我将这些行加载到名为“日期”的数据框中。然后我使用 lubridate 将此字符列转换为日期时间,以期找到最小/最大日期。

  dates <- csv[c('datetime')]
  dates$datetime <- ymd_hms(dates$datetime)

运行此代码我收到以下错误消息:

Warning message:
3 failed to parse. 

我接受这一点,因为 CSV 可能会在其中包含一些 janky 日期和下一次运行:

min(dates$datetime) 
max(dates$datetime)

这两个都返回 NA,我认为这是来自仍然存储在数据框中的几个损坏的日期。我四处寻找快速修复方法,甚至尝试构建一个 foreach 循环来确定问题日期,但没有运气。识别 3 个损坏日期的简单方法是什么?

example date format: 2015-06-17 17:10:16 +0000

【问题讨论】:

  • 可以检查格式是否一致。还要检查?guess_formats
  • 如果按日期时间向量排序,NA 是在头部还是尾部?
  • @akrun 我试图在 excel 中通过导入 csv 并检查每个单元格的长度并过滤任何不合适的地方来做到这一点。这没有产生任何结果,有没有办法在 R 中做到这一点?我尝试了guess_formats & parse_date_time,但都失败了。
  • @lawyeR 就是这样!我对未解析的原始 csv 进行了排序,然后 tail(dates) 显示了三个不正确的字段。感谢您的帮助!
  • 您还可以使用which(is.na(dates$datetime)) 找到缺失日期的行号。

标签: r date lubridate


【解决方案1】:

上述 cmets 对 LawyeR 和 Stibu 的致谢:

  1. 我首先对原始 csv 列进行了排序,并做了一个 head() & tail() 来查找 哪 3 个日期造成了麻烦
  2. 或者which(is.na(dates$datetime)) 是一个简单的单行代码,也可以找到答案。

【讨论】:

  • 这很好,但并不能真正回答一般问题。如果问题是字符“purpleElephant”在您的数据中怎么办?它不是 NA,但仍然无法解析。我们仍然需要一些方法来查看 Lubridate 给出的警告。
  • 问题是关于识别三个损坏的日期,而这完美地完成了。
  • 但它之所以能做到这一点,是因为这 3 个日期恰好是 NA。我有一个包含约 17 个 NA 的 93 个日期/日期时间的向量,并且得到“2 解析失败”。所以这个解决方案不能解决一般问题,只是 OP 的问题。
【解决方案2】:

Lubridate 在尝试解析因夏令时而不存在的日期时会抛出该错误。

例如:

library(lubridate)
mydate <- strptime('2020-03-08 02:30:00', format = "%Y-%m-%d %H:%M:%S")
ymd_hms(mydate, tz = "America/Denver")

[1] NA
Warning message:
 1 failed to parse. 

我的数据来自一个不知道 DST 的非智能传感器,因此我的时间序列中出现了不可能(但格式正确)的日期。

【讨论】:

    【解决方案3】:

    如果了解 lubridate 失败的索引有用,您可以使用带有 stopifnot() 的 for 循环并打印每个成功的解析。

    制作一些日期,在随机位置抛出错误。

    library(lubridate)
    set.seed(1)
    my_dates<-as.character(sample(seq(as.Date('1900/01/01'), 
    as.Date('2000/01/01'), by="day"), 1000))
    my_dates[sample(1:length(my_dates), 1)]<-"purpleElephant"
    

    现在使用 for 循环并使用 stopifnot() 打印每个成功的解析。

    for(i in 1:length(my_dates)){
       print(i)
       stopifnot(!is.na(ymd(my_dates[i])))
    }
    
    

    【讨论】:

      【解决方案4】:

      使用截断参数。日期时间数据中最常见的不规则类型是由于四舍五入或时间戳不可用而导致的截断。

      因此,尝试 truncated = 1,然后可能会上升到 truncated = 3:

        dates <- csv[c('datetime')]
        dates$datetime <- ymd_hms(dates$datetime, truncated = 1)
      

      【讨论】:

        【解决方案5】:

        为了提供更通用的答案,首先过滤掉NAs,然后尝试解析,然后只过滤NAs。这将向您展示失败之处。比如:

        dates2 <- dates[!is.na(dates2$datetime)]
        dates2$datetime <- ymd_hms(dates2$datetime)
        
        Warning message:
         3 failed to parse.
        
        dates2[is.na(dates2$datetime)]
        

        【讨论】:

          猜你喜欢
          • 2018-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多