周日似乎是从版本 4.2.3 更新到 4.3.2(在 Win 10 上)的好日子,以开始新的一周。
我使用R
包将一些时间序列写入基本文本文件以保存数据。这工作了很多年,但在上述升级之后,我遇到了输出的变化,突然午夜时间被遗漏了:
要测试的代码(使用zoo
版本1.8.12):
zoo
对于 4.3.0 之前的 R,结果如下所示:
library(zoo)
write.zoo(
zoo(
c(46, 47),
c(as.POSIXct("2023-11-26 00:00:00"), as.POSIXct("2023-11-26 01:00:00"))
)
)
但是从 4.3.0 开始它变成了:
"2023-11-26 00:00:00" 46
"2023-11-26 01:00:00" 47
正如
"2023-11-26" 46
"2023-11-26 01:00:00" 47
的文档所说,
zoo
是 write.zoo()
的一个便利函数,我尝试用这个再次获得正确的结果(带有午夜时间戳):write.table()
输出
write.table(
zoo(
c(46, 47),
c(as.POSIXct("2023-11-26 00:00:00"), as.POSIXct("2023-11-26 01:00:00"))
)
)
在任何提到的
"2023-11-26 00:00:00" 46
"2023-11-26 01:00:00" 47
版本下。
所以看起来R
函数已经被 R >= 4.3.0 破坏了,但故事还在继续......
正如人们在write.zoo
sources中所看到的,这个函数相当简单,通过在使用
zoo
时复制索引,从动物园对象生成 data.frame
。再次测试这个对 POSIXct 对象的非常简单的调用
R
as.character()
<4.3.0:
R >=4.3.0:
> as.character(c(as.POSIXct("2023-11-26 00:00:00"), as.POSIXct("2023-11-26 01:00:00")))
[1] "2023-11-26 00:00:00" "2023-11-26 01:00:00"
告诉我,这可能是
> as.character(c(as.POSIXct("2023-11-26 00:00:00"), as.POSIXct("2023-11-26 01:00:00")))
[1] "2023-11-26" "2023-11-26 01:00:00"
失败的原因现在我很困惑,因为这是非常基本的 R 功能,在 R News
中没有提到要更改。输出看起来也很尴尬 - 为什么要产生两种不同的格式? 关于
R write.table remove 0:00:00 from Timestamps 还有另一个问题,它直接在 write.zoo()
上使用
write.table()
(所以这里没有 data.frame
),并且在我的情况下也产生相同的结果:zoo
很明显,我的“解决方法”是在
> write.table(data.frame(Index = c(as.POSIXct("2023-11-26 00:00:00"), as.POSIXct("2023-11-26 01:00:00")), Value = c(46, 47)), row.names = FALSE)
"Index" "Value"
2023-11-26 46
2023-11-26 01:00:00 47
对象上使用
write.table()
才有效,因为这些对象内部不同。不幸的是,这超出了我对 zoo
以及 R
行为是否有意且有用的理解。社区对此有何进一步解释?
as.character()
对象的
as.character()
行为变化引发的。我刚刚在 R-Forge 上对 POSIXt
进行了更新,现在使用
write.zoo()
而不是旧的 format(index(x))
(这从来就不是一个理想的选择)。更新可以通过 R-Forge 安装
as.character(index(x))