R语言plot()函数报错:'to'必须是有限数(Windows/macOS特定)
解决Base R中POSIXct时间序列绘图在Windows/macOS的报错问题
问题重现
运行以下Base R代码时,Windows和macOS系统会触发报错,Ubuntu系统无此问题:
xt = as.POSIXct(c("2023-09-03 12:00:00", "2023-09-03 16:01:40"), tz = "Chile/Continental") plot(xt, c(1, 2), type = "l")
报错信息:
Error in seq.int(0, to0 - from, by) : 'to' must be a finite number
报错原因
核心差异在于不同操作系统的时区数据库处理逻辑不一致:
- Ubuntu使用标准IANA时区数据库,对智利大陆时区2023年9月的夏令时转换处理正确;
- Windows使用自家的时区数据库,macOS使用苹果修改后的IANA数据库,二者在解析该时间段的时间戳时,出现了时间差计算异常(生成非有限值,如
NaN)。Base R的plot.POSIXct函数内部会调用seq.int生成时间轴刻度,当时间差参数为非有限值时,就会触发该报错。
解决方案(均为Base R实现)
方案1:转换为UTC时区绘图
跳过本地时区的转换问题,将时间戳强制转换为UTC时区后绘图:
xt = as.POSIXct(c("2023-09-03 12:00:00", "2023-09-03 16:01:40"), tz = "Chile/Continental") attr(xt, "tzone") = "UTC" plot(xt, c(1, 2), type = "l")
方案2:手动指定x轴范围
绕过自动计算时间轴刻度的逻辑,直接用时间戳的数值范围作为x轴限制:
xt = as.POSIXct(c("2023-09-03 12:00:00", "2023-09-03 16:01:40"), tz = "Chile/Continental") plot(xt, c(1, 2), type = "l", xlim = range(as.numeric(xt)))
方案3:显式解析时间格式
用strptime显式指定时间格式和时区,再转换为POSIXct,确保时间解析的一致性:
xt = as.POSIXct( strptime( c("2023-09-03 12:00:00", "2023-09-03 16:01:40"), format = "%Y-%m-%d %H:%M:%S", tz = "Chile/Continental" ) ) plot(xt, c(1, 2), type = "l")
验证
以上三种方案均可在Windows/macOS系统上正常生成预期的折线图,横轴正确显示时间刻度,解决原报错问题。
内容的提问来源于stack exchange,提问作者V. van Hees
相关产品推荐
相关产品推荐

