如何防止 write.csv 将 POSIXct、日期和时间类更改回字符/因子?

Cat*_*res 6 time r date posixct write.table

我有一个 .csv 文件,其中每个字段用于日期时间、日期和时间。最初它们都是字符字段,我已经相应地转换了它们。在我的代码结束时,如果我这样做:

str(data)
Run Code Online (Sandbox Code Playgroud)

我会得到

datetime: POSIXct
date: Date
time: Class 'times'  atomic [1:2820392] (....) attr(*, "format")= chr "h:m:s"
Run Code Online (Sandbox Code Playgroud)

现在,我对此非常满意,我想创建一个 .csv 文件,所以这就是我所拥有的:

write.csv(data, file = "data.csv", row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)

我也试过

write.table(data, "data.csv", sep = ",", row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)

我对两者都得到了相同的结果,这就是在编写新的 .csv 时我的所有转换都丢失了:一切都回到了一个角色。

我怀疑我在 write 函数中遗漏了一些参数,但我整个下午都在搜索,但找不到什么。有人可以帮忙吗?

小智 6

如果你想保留所有的时间信息以便再次读取,这个秘籍应该有效:

dat <- data.frame(time=as.POSIXlt("2013-04-25 09:00 BST"), quantity=1)
dat2 <- dat
dat2$time <- format(dat2$time, usetz=TRUE)
write.csv(dat2, "time.csv", row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)

它提供了以下 CSV 文件:

"time","quantity"
"2013-04-25 09:00:00 BST",1
Run Code Online (Sandbox Code Playgroud)

其中明确显示时区信息;如果您应用write.csv到原件dat,格式将丢失。

  • 如果你有 `dplyr` 和 `lubridate` 你可以 `write.csv(mutate(data, time=format(time, "%FT%H:%M:%S%z")), file=" test.csv", row.names=FALSE)` 作为单行生成具有 ISO8601 日期的 csv(因此您不会丢失任何信息)。您可以使用`df2 &lt;- read.csv("test.csv") %&gt;% mutate(time=ymd_hms(time))`从文件中恢复数据帧。 (4认同)

Jos*_*ich 4

根据?write.table:

数据框中任何列表或具有类(例如日期)的列都将通过适当的“as.character”方法进行转换:默认情况下,此类列不带引号。

简而言之,您只能将文本/字符写入文本文件。save如果您想保留对象的二进制 R 表示形式,请使用。