我有一个.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时我的所有转换都会丢失:一切都回归成为一个角色。
我怀疑我在写函数中缺少一些参数,但我整个下午都在搜索,但我无法找到答案。有人可以帮忙吗?
答案 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)
如果您愿意添加dplyr
和lubridate
作为依赖项,则可以在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))