作为一个R新手,我正在试着调试神秘的R错误。我有一个包含150k行的csv,我加载到一个名为'date'的数据框中。然后我使用lubridate将此字符列转换为日期时间,以期找到最小/最大日期。
dates <- csv[c('datetime')]
dates$datetime <- ymd_hms(dates$datetime)
运行此代码我收到以下错误消息:
Warning message:
3 failed to parse.
我接受这一点,因为CSV可能会在那里和下一次运行中有一些笨拙的日期:
min(dates$datetime)
max(dates$datetime)
这两个都返回NA,我假设它来自仍存储在数据框中的少数破碎日期。我已经四处寻找快速解决方案,甚至试图建立一个foreach循环来确定问题日期,但没有运气。什么是识别3个破损日期的简单方法?
example date format: 2015-06-17 17:10:16 +0000
答案 0 :(得分:5)
从以上评论中获得LawyeR和Stibu的信息:
which(is.na(dates$datetime))
是一个简单的单行班,也可以找到答案。答案 1 :(得分:0)
由于夏令时,尝试解析不存在的日期时,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的智能传感器,因此时间序列中不可能出现(但格式正确)的日期。
答案 2 :(得分:0)
如果知道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])))
}
答案 3 :(得分:0)
使用截断参数。日期时间数据中最常见的不规则类型是由于舍入或时间戳不可用而导致的截断。
因此,尝试截断= 1,然后可能上升到截断= 3:
dates <- csv[c('datetime')]
dates$datetime <- ymd_hms(dates$datetime, truncated = 1)
答案 4 :(得分:0)
要提供更通用的答案,请先过滤掉 NA
,然后尝试解析,然后仅过滤 NA
。这将向您展示失败之处。类似的东西:
dates2 <- dates[!is.na(dates2$datetime)]
dates2$datetime <- ymd_hms(dates2$datetime)
Warning message:
3 failed to parse.
dates2[is.na(dates2$datetime)]