6

我有一个 .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 时所有的转换都丢失了:一切都回到了角色。

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

4

3 回答 3

7

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

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的,格式就丢失了。

于 2015-04-23T15:38:02.797 回答
3

根据?write.table

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

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

于 2014-04-25T14:14:57.513 回答
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))
于 2020-10-23T08:19:36.797 回答