将数据设置为xts时处理“丢失”时间

时间:2019-06-09 19:20:42

标签: r

我有一些类似下面的数据;

                Dates    Open   Close
1000  06/06/2019 0:05 244.599 244.524
1001  06/06/2019 0:04 244.592 244.599
1002  06/06/2019 0:03 244.564 244.592
1003  06/06/2019 0:02 244.809 244.564
1004  06/06/2019 0:01 244.849 244.809
1005       06/06/2019 245.080 244.849
1006 05/06/2019 23:59 245.092 245.080
1007 05/06/2019 23:58 245.253 245.092
1008 05/06/2019 23:57 244.858 245.253
1009 05/06/2019 23:56 244.643 244.863
1010 05/06/2019 23:55 244.720 244.643

1005行没有时间戳的地方。我尝试将日期设置为POSIXlt格式。

data$Dates <- gsub("/", "-", data$Dates)
data$Dates <- as.POSIXlt(strptime(data$Dates, format="%d-%m-%Y  %H:%M"))

现在我的数据如下:

                   Dates    Open   Close
1000 2019-06-06 00:05:00 244.599 244.524
1001 2019-06-06 00:04:00 244.592 244.599
1002 2019-06-06 00:03:00 244.564 244.592
1003 2019-06-06 00:02:00 244.809 244.564
1004 2019-06-06 00:01:00 244.849 244.809
1005                <NA> 245.080 244.849
1006 2019-06-05 23:59:00 245.092 245.080
1007 2019-06-05 23:58:00 245.253 245.092
1008 2019-06-05 23:57:00 244.858 245.253
1009 2019-06-05 23:56:00 244.643 244.863
1010 2019-06-05 23:55:00 244.720 244.643

我只是想知道是否有一种方法可以在没有小时或分钟数据的情况下转换时间。它仅在0:00

小时发生

数据:

data <- structure(list(Dates = c("06/06/2019 0:05", "06/06/2019 0:04", 
"06/06/2019 0:03", "06/06/2019 0:02", "06/06/2019 0:01", "06/06/2019", 
"05/06/2019 23:59", "05/06/2019 23:58", "05/06/2019 23:57", "05/06/2019 23:56", 
"05/06/2019 23:55"), Open = c(244.599, 244.592, 244.564, 244.809, 
244.849, 245.08, 245.092, 245.253, 244.858, 244.643, 244.72), 
    Close = c(244.524, 244.599, 244.592, 244.564, 244.809, 244.849, 
    245.08, 245.092, 245.253, 244.863, 244.643)), row.names = 1000:1010, class = "data.frame")

编辑:

我只是想也许我应该先将该列分成两部分(一个用于日期,另一个用于时间),用0:00填充第二列的空白单元格,然后粘贴回去。

2 个答案:

答案 0 :(得分:2)

lubridate软件包中的

parse_date_time将连续检查备用格式,直到为格式提供了矢量,直到成功为止。分隔符和百分号可以从格式字符串中省略。

library(lubridate)

parse_date_time(data$Dates, c("dmYHM", "dmY"), tz = "")

给予:

 [1] "2019-06-06 00:05:00 EDT" "2019-06-06 00:04:00 EDT"
 [3] "2019-06-06 00:03:00 EDT" "2019-06-06 00:02:00 EDT"
 [5] "2019-06-06 00:01:00 EDT" "2019-06-06 00:00:00 EDT"
 [7] "2019-06-05 23:59:00 EDT" "2019-06-05 23:58:00 EDT"
 [9] "2019-06-05 23:57:00 EDT" "2019-06-05 23:56:00 EDT"
[11] "2019-06-05 23:55:00 EDT"

答案 1 :(得分:1)

使用dplyr,一种可能是:

data %>%
 mutate(Dates = ifelse(nchar(Dates) == 10, paste(Dates, "0:00", sep = " "), Dates),
        Dates = as.POSIXct(Dates, format = "%d/%m/%Y %H:%M"))

                 Dates    Open   Close
1  2019-06-06 00:05:00 244.599 244.524
2  2019-06-06 00:04:00 244.592 244.599
3  2019-06-06 00:03:00 244.564 244.592
4  2019-06-06 00:02:00 244.809 244.564
5  2019-06-06 00:01:00 244.849 244.809
6  2019-06-06 00:00:00 245.080 244.849
7  2019-06-05 23:59:00 245.092 245.080
8  2019-06-05 23:58:00 245.253 245.092
9  2019-06-05 23:57:00 244.858 245.253
10 2019-06-05 23:56:00 244.643 244.863
11 2019-06-05 23:55:00 244.720 244.643

在这里,对于仅包含10个字符的行,它将日期与0:00结合在一起。

base R相同:

data$Dates <- ifelse(nchar(data$Dates) == 10, paste(data$Dates, "0:00", sep = " "), data$Dates)
as.POSIXct(data$Dates, format = "%d/%m/%Y %H:%M")