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

时间:2014-04-25 14:10:49

标签: r date time posixct write.table

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

str(data)

我会得到

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

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

write.csv(data, file = "data.csv", row.names = FALSE)

我也试过

write.table(data, "data.csv", sep = ",", row.names = FALSE)

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

我怀疑我在写函数中缺少一些参数,但我整个下午都在搜索,但我无法找到答案。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

根据?write.table

  

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

简单地说,您只能将文本/字符写入文本文件。如果要保留对象的二进制R表示,请使用save

答案 1 :(得分:3)

如果您想保留所有时间信息以便再次读取,则此配方应该有效:

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)

它提供以下CSV文件:

"time","quantity"
"2013-04-25 09:00:00 BST",1

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

答案 2 :(得分:0)

如果您愿意添加dplyrlubridate作为依赖项,则可以在ISO8601中生成带有日期的CSV(这样就不会丢失任何信息),如下所示:

#install.packages("tidyverse")
#install.packages("dplyr")
library(dplyr)
library(lubridate, warn.conflicts = FALSE)
dat <- data.frame(time=as.POSIXlt("2013-04-25 09:00 BST"), quantity=1) # example data
write.csv(mutate(dat, time=format(time, "%FT%H:%M:%S%z")), file="test.csv", row.names=FALSE)

这将生成具有以下内容的CSV文件:

"time","quantity"
"2013-04-25T09:00:00+0200",1

您会看到CSV包含ISO8601中的日期以及时区信息,因此不会丢失任何信息。

如果您想读回该CSV文件,则可以

df2 <- read.csv("test.csv") %>% mutate(time=ymd_hms(time))