lubridate converting midnight timestamp returns NA:如何填充缺少的时间戳
lubridate converting midnight timestamp returns NA: how to fill missing timestamp
我在 R 中有一个从 CSV 导入的数据框。 csv 中的 "time" 格式为“%Y-%m-%d %H:%M:%S”,如下所示:
> head(btc_data)
time btc_price
1 2017-08-27 22:50:00 4,389.6113
2 2017-08-27 22:51:00 4,389.0850
3 2017-08-27 22:52:00 4,388.8625
4 2017-08-27 22:53:00 4,389.7888
5 2017-08-27 22:56:00 4,389.9138
6 2017-08-27 22:57:00 4,390.1663
当我 运行 str(btc_data)
时间列作为一个因素返回。因此,我使用 lubridate 包将其转换为日期时间,如下所示:
btc_data$time <- ymd_hms(as.character(btc_data$time))
问题是午夜收集的数据(5 行)无法解析并且 return NA 值是这样的(在原始数据中,这些行缺少时间戳,因此列出了 2017-08-29 00:00:00
就像 2017-08-29
) -
724 2017-08-28 23:59:00 4,439.3313
725 NA 4,439.6588
726 2017-08-29 00:01:00 4,440.3050
此外,第二个数据框的组织方式不同:
> str(eth_data)
'data.frame': 1081 obs. of 2 variables:
$ time : Factor w/ 1081 levels "8/28/17 16:19",..: 1 2 3 4 5 6 7 8 9 10 ...
$ eth_price: num 344 344 344 344 343 ...
当我尝试时:
> eth_data$time <- mdy_hms(as.character(eth_data$time))
我收到以下错误:
Warning message: All formats failed to parse. No formats found.
编辑:我已经隔离了导致问题的代码问题:
> btc_data[721:726,]
time btc_price
721 2017-08-28 23:57:00 4,439.8163
722 2017-08-28 23:58:00 4,440.2363
723 2017-08-28 23:58:00 4,440.2363
724 2017-08-28 23:59:00 4,439.3313
725 2017-08-29 4,439.6588
726 2017-08-29 00:01:00 4,440.3050
因此,每次午夜钟声敲响时,都不会记录时间戳。 CSV 是通过数据流创建的,并且在不断增长,所以这个问题每天都会继续发生,除非我能找到解决方法。有什么建议吗?
如果原始数据中的 '00:00:00' 完全缺失,您可以使用 grep 查找这些情况,然后在使用 ymd_hms() 或 mdy_hm() 函数。
第一种情况,其中 date/time 格式为 'YYYY-mm-dd HH:MM:SS':
#Before
test <- fread("time, btc_price
2017-08-28 23:57:00, 4439.8163
2017-08-28 23:58:00, 4440.2363
2017-08-28 23:58:00, 4440.2363
2017-08-28 23:59:00, 4439.3313
2017-08-29 , 4439.6588
2017-08-29 00:01:00, 4440.3050")
test$time[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}$",test$time)] <- paste(
test$time[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}$",test$time)],"00:00:00")
#After
print(test)
time btc_price
1: 2017-08-28 23:57:00 4439.816
2: 2017-08-28 23:58:00 4440.236
3: 2017-08-28 23:58:00 4440.236
4: 2017-08-28 23:59:00 4439.331
5: 2017-08-29 00:00:00 4439.659
6: 2017-08-29 00:01:00 4440.305
#Now you can use ymd_hms(as.character(df$date)) as usual.
第二种情况,其中date/time格式为'm/dd/yy HH:MM':
#Step 1 is to find/replace:
test <- fread("time, btc_price
8/28/17 23:57, 4439.8163
8/28/17 23:57, 4440.2363
8/28/17 23:57, 4440.2363
8/28/17 23:57, 4439.3313
8/28/17 , 4439.6588
8/29/17 00:01, 4440.3050")
test$time[grep("[0-9]{1}/[0-9]{2}/[0-9]{2}$",test$time)] <- paste(
test$time[grep("[0-9]{1}/[0-9]{2}/[0-9]{2}$",test$time)],"00:00"
)
print(test)
time btc_price
1: 8/28/17 23:57 4439.816
2: 8/28/17 23:57 4440.236
3: 8/28/17 23:57 4440.236
4: 8/28/17 23:57 4439.331
5: 8/28/17 00:00 4439.659
6: 8/29/17 00:01 4440.305
#Step 2 is to adjust your mdy_hms() command; you need to leave off the 's':
#Ex. before:
mdy_hms(as.character("8/28/17 16:19"))
[1] NA
Warning message:
All formats failed to parse. No formats found.
#After
test <- c("8/28/17 16:19","8/28/17 00:00")
mdy_hm(as.character(test))
[1] "2017-08-28 16:19:00 UTC" "2017-08-28 00:00:00 UTC"
一般来说,在 R 中不使用逗号格式化数字也是一种很好的做法;所以 4,439.3313 应该是 4439.3313。否则,R 可能会将其解释为列之间的逗号分隔。
我在 R 中有一个从 CSV 导入的数据框。 csv 中的 "time" 格式为“%Y-%m-%d %H:%M:%S”,如下所示:
> head(btc_data)
time btc_price
1 2017-08-27 22:50:00 4,389.6113
2 2017-08-27 22:51:00 4,389.0850
3 2017-08-27 22:52:00 4,388.8625
4 2017-08-27 22:53:00 4,389.7888
5 2017-08-27 22:56:00 4,389.9138
6 2017-08-27 22:57:00 4,390.1663
当我 运行 str(btc_data)
时间列作为一个因素返回。因此,我使用 lubridate 包将其转换为日期时间,如下所示:
btc_data$time <- ymd_hms(as.character(btc_data$time))
问题是午夜收集的数据(5 行)无法解析并且 return NA 值是这样的(在原始数据中,这些行缺少时间戳,因此列出了 2017-08-29 00:00:00
就像 2017-08-29
) -
724 2017-08-28 23:59:00 4,439.3313
725 NA 4,439.6588
726 2017-08-29 00:01:00 4,440.3050
此外,第二个数据框的组织方式不同:
> str(eth_data)
'data.frame': 1081 obs. of 2 variables:
$ time : Factor w/ 1081 levels "8/28/17 16:19",..: 1 2 3 4 5 6 7 8 9 10 ...
$ eth_price: num 344 344 344 344 343 ...
当我尝试时:
> eth_data$time <- mdy_hms(as.character(eth_data$time))
我收到以下错误:
Warning message: All formats failed to parse. No formats found.
编辑:我已经隔离了导致问题的代码问题:
> btc_data[721:726,]
time btc_price
721 2017-08-28 23:57:00 4,439.8163
722 2017-08-28 23:58:00 4,440.2363
723 2017-08-28 23:58:00 4,440.2363
724 2017-08-28 23:59:00 4,439.3313
725 2017-08-29 4,439.6588
726 2017-08-29 00:01:00 4,440.3050
因此,每次午夜钟声敲响时,都不会记录时间戳。 CSV 是通过数据流创建的,并且在不断增长,所以这个问题每天都会继续发生,除非我能找到解决方法。有什么建议吗?
如果原始数据中的 '00:00:00' 完全缺失,您可以使用 grep 查找这些情况,然后在使用 ymd_hms() 或 mdy_hm() 函数。
第一种情况,其中 date/time 格式为 'YYYY-mm-dd HH:MM:SS':
#Before
test <- fread("time, btc_price
2017-08-28 23:57:00, 4439.8163
2017-08-28 23:58:00, 4440.2363
2017-08-28 23:58:00, 4440.2363
2017-08-28 23:59:00, 4439.3313
2017-08-29 , 4439.6588
2017-08-29 00:01:00, 4440.3050")
test$time[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}$",test$time)] <- paste(
test$time[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}$",test$time)],"00:00:00")
#After
print(test)
time btc_price
1: 2017-08-28 23:57:00 4439.816
2: 2017-08-28 23:58:00 4440.236
3: 2017-08-28 23:58:00 4440.236
4: 2017-08-28 23:59:00 4439.331
5: 2017-08-29 00:00:00 4439.659
6: 2017-08-29 00:01:00 4440.305
#Now you can use ymd_hms(as.character(df$date)) as usual.
第二种情况,其中date/time格式为'm/dd/yy HH:MM':
#Step 1 is to find/replace:
test <- fread("time, btc_price
8/28/17 23:57, 4439.8163
8/28/17 23:57, 4440.2363
8/28/17 23:57, 4440.2363
8/28/17 23:57, 4439.3313
8/28/17 , 4439.6588
8/29/17 00:01, 4440.3050")
test$time[grep("[0-9]{1}/[0-9]{2}/[0-9]{2}$",test$time)] <- paste(
test$time[grep("[0-9]{1}/[0-9]{2}/[0-9]{2}$",test$time)],"00:00"
)
print(test)
time btc_price
1: 8/28/17 23:57 4439.816
2: 8/28/17 23:57 4440.236
3: 8/28/17 23:57 4440.236
4: 8/28/17 23:57 4439.331
5: 8/28/17 00:00 4439.659
6: 8/29/17 00:01 4440.305
#Step 2 is to adjust your mdy_hms() command; you need to leave off the 's':
#Ex. before:
mdy_hms(as.character("8/28/17 16:19"))
[1] NA
Warning message:
All formats failed to parse. No formats found.
#After
test <- c("8/28/17 16:19","8/28/17 00:00")
mdy_hm(as.character(test))
[1] "2017-08-28 16:19:00 UTC" "2017-08-28 00:00:00 UTC"
一般来说,在 R 中不使用逗号格式化数字也是一种很好的做法;所以 4,439.3313 应该是 4439.3313。否则,R 可能会将其解释为列之间的逗号分隔。