在 R Lubridate 中查找无法解析的日期
Find dates that fail to parse in R Lubridate
作为一名 R 新手,我正在竭尽全力调试神秘的 R 错误。我有一个包含 150k 行的 csv,我将它们加载到名为 'date' 的数据框中。然后我使用 lubridate 将此字符列转换为日期时间,希望找到 min/max 日期。
dates <- csv[c('datetime')]
dates$datetime <- ymd_hms(dates$datetime)
运行 此代码我收到以下错误消息:
Warning message:
3 failed to parse.
我接受这个,因为 CSV 中可能有一些糟糕的日期和下一个 运行:
min(dates$datetime)
max(dates$datetime)
这两个 return NA,我认为这是来自仍然存储在数据框中的几个损坏的日期。我四处寻找快速修复方法,甚至尝试构建一个 foreach 循环来确定问题日期,但没有成功。识别 3 个损坏日期的简单方法是什么?
example date format: 2015-06-17 17:10:16 +0000
以上评论归功于 LawyeR 和 Stibu:
- 我首先对原始 csv 列进行排序,然后执行 head() 和 tail() 查找
哪 3 个日期造成了麻烦
- 或者
which(is.na(dates$datetime))
是一个简单的班轮也能找到答案。
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 的非智能传感器,因此我的时间序列中出现了不可能(但格式正确)的日期。
如果知道 lubridate 失败的索引很有用,您可以使用 for 循环和 stopifnot() 并打印每个成功的解析。
创建一些日期,在其中的随机位置抛出一个错误。
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])))
}
使用截断参数。 date-time 数据中最常见的不规则类型是由于四舍五入或时间戳不可用而导致的截断。
因此,尝试截断 = 1,然后可能会上升到截断 = 3:
dates <- csv[c('datetime')]
dates$datetime <- ymd_hms(dates$datetime, truncated = 1)
要提供更通用的答案,请先过滤掉 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)]
作为一名 R 新手,我正在竭尽全力调试神秘的 R 错误。我有一个包含 150k 行的 csv,我将它们加载到名为 'date' 的数据框中。然后我使用 lubridate 将此字符列转换为日期时间,希望找到 min/max 日期。
dates <- csv[c('datetime')]
dates$datetime <- ymd_hms(dates$datetime)
运行 此代码我收到以下错误消息:
Warning message:
3 failed to parse.
我接受这个,因为 CSV 中可能有一些糟糕的日期和下一个 运行:
min(dates$datetime)
max(dates$datetime)
这两个 return NA,我认为这是来自仍然存储在数据框中的几个损坏的日期。我四处寻找快速修复方法,甚至尝试构建一个 foreach 循环来确定问题日期,但没有成功。识别 3 个损坏日期的简单方法是什么?
example date format: 2015-06-17 17:10:16 +0000
以上评论归功于 LawyeR 和 Stibu:
- 我首先对原始 csv 列进行排序,然后执行 head() 和 tail() 查找 哪 3 个日期造成了麻烦
- 或者
which(is.na(dates$datetime))
是一个简单的班轮也能找到答案。
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 的非智能传感器,因此我的时间序列中出现了不可能(但格式正确)的日期。
如果知道 lubridate 失败的索引很有用,您可以使用 for 循环和 stopifnot() 并打印每个成功的解析。
创建一些日期,在其中的随机位置抛出一个错误。
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])))
}
使用截断参数。 date-time 数据中最常见的不规则类型是由于四舍五入或时间戳不可用而导致的截断。
因此,尝试截断 = 1,然后可能会上升到截断 = 3:
dates <- csv[c('datetime')]
dates$datetime <- ymd_hms(dates$datetime, truncated = 1)
要提供更通用的答案,请先过滤掉 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)]