xts 转换在 7 行数据帧上失败

xts conversion fails on 7 line data frame

我正在尝试读取一个 csv 文件并创建一个 xts 对象。 xts 转换函数在 7 行输入文件上失败。错误是:

xts(Lagoon$Inst, Lagoon$time) 错误: 'order.by' 不能包含 'NA'、'NaN' 或 'Inf'

密码是:

require(xts)
> Lagoon <- read.csv("Mara/csv/test/X8.csv")
> Lagoon
                 time Inst
1 00:45:00 03/10/2019 5.76
2 01:00:00 03/10/2019 5.77
3 01:15:00 03/10/2019 5.81
4 01:30:00 03/10/2019 5.61
5 01:45:00 03/10/2019 5.46
6 02:00:00 03/10/2019 5.40
7 02:15:00 03/10/2019 5.38
> Lagoon$time <- as.POSIXlt(Lagoon$time, format = "%H:%M:%S %m/%d/%Y")
> Lagoon
                 time Inst
1 2019-03-10 00:45:00 5.76
2 2019-03-10 01:00:00 5.77
3 2019-03-10 01:15:00 5.81
4 2019-03-10 01:30:00 5.61
5 2019-03-10 01:45:00 5.46
6 2019-03-10 02:00:00 5.40
7 2019-03-10 02:15:00 5.38
> xtsLagoon <- xts(Lagoon$Inst,Lagoon$time)
Error in xts(Lagoon$Inst, Lagoon$time) : 
  'order.by' cannot contain 'NA', 'NaN', or 'Inf'
> 

我尝试将真实的输入文件切成越来越小的块;上面的 csv 文件是一个最小的可重现示例。删除一行数据会创建一个文件,该文件确实正确转换为 xts 对象。

请注意,当我在尝试转换之前列出 Lagoon 数据框时,它看起来不错(没有 NA、Nan 或 Inf)。

我的xts版本是最新的(0.12.1)

我做错了什么?这是 xts 转换函数中的错误吗?任何帮助表示赞赏!

这可能是最后两个元素转换的问题(因为它 returns NAas.POSIXct - 可能是由于夏令时)。一种选择是使用 parse_date (parsedate) 转换为 Datetime 对象,然后使用 xts

library(parsedate)
Lagoon$time <- parse_date(Lagoon$time)
xts::xts(Lagoon$Inst,Lagoon$time)
                [,1]
2019-03-10 00:45:00 5.76
2019-03-10 01:00:00 5.77
2019-03-10 01:15:00 5.81
2019-03-10 01:30:00 5.61
2019-03-10 01:45:00 5.46
2019-03-10 02:00:00 5.40
2019-03-10 02:15:00 5.38

数据

Lagoon <- structure(list(time = c("00:45:00 03/10/2019", "01:00:00 03/10/2019", 
"01:15:00 03/10/2019", "01:30:00 03/10/2019", "01:45:00 03/10/2019", 
"02:00:00 03/10/2019", "02:15:00 03/10/2019"), Inst = c(5.76, 
5.77, 5.81, 5.61, 5.46, 5.4, 5.38)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7"))

问题中没有显示输入文件,所以我们假设我们在最后的注释中生成了可重现的文件。使用 read.csv.zoo 并确保将时区指定为 "UTC",因为在您当地的时区,02:15 在 03/10/2019 不存在,因为从标准到夏令时的变化节省时间。

(交替使用问题中的代码,除了 (1) 首先使用 Sys.setenv(TZ = "UTC") 将会话的时区设置为 UTC 和 (2) 使用 as.POSIXct 而不是 as.POSIXlt。)

library(xts)

z <- read.csv.zoo("X8.csv", format = "%H:%M:%S %m/%d/%Y", tz = "UTC")
x <- as.xts(z)

备注

Lines <- "time,Inst
00:45:00 03/10/2019,5.76
01:00:00 03/10/2019,5.77
01:15:00 03/10/2019,5.81
01:30:00 03/10/2019,5.61
01:45:00 03/10/2019,5.46
02:00:00 03/10/2019,5.40
02:15:00 03/10/2019,5.38"
cat(Lines, file = "X8.csv")