Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止write.csv将POSIXct、日期和时间类更改回字符/因子?_R_Date_Time_Posixct_Write.table - Fatal编程技术网

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

如何防止write.csv将POSIXct、日期和时间类更改回字符/因子?,r,date,time,posixct,write.table,R,Date,Time,Posixct,Write.table,我有一个.csv文件,每个文件有一个datetime、date和time字段。 最初,它们都是字符字段,我对它们进行了相应的转换。 在代码末尾,如果我这样做: str(data) 我会得到 datetime: POSIXct date: Date time: Class 'times' atomic [1:2820392] (....) attr(*, "format")= chr "h:m:s" 现在,我对此非常满意,我想创建一个.csv文件,所以我有: write.csv(data,

我有一个.csv文件,每个文件有一个datetime、date和time字段。 最初,它们都是字符字段,我对它们进行了相应的转换。 在代码末尾,如果我这样做:

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函数中遗漏了一些参数,但我整个下午都在搜索,找不到什么。可以请一些人帮忙吗?

根据
写下。表格

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


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

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

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)

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

如果您愿意添加
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包含ISO8601中的日期和时区信息,因此不会丢失任何信息

如果你想读回CSV,你可以

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

谢谢你的回答,约书亚。我需要将我的文件读入ArcMap,所以保存对我来说还不够好——反正我还是设法找到了。然而,我发现.csv毕竟没有那么糟糕:如果格式正确,ArcMap会正确地将字符类型解释为日期、时间甚至日期时间——只要我在地理数据库中创建我的shapefile。如果你有
dplyr
lubridate
,你就可以
write.csv(mutate(数据,时间=格式(时间,“%FT%H:%M:%S%z”)、file=“test.csv”,row.names=FALSE)
作为一个线性行生成日期在ISO8601中的csv(这样您就不会丢失任何信息)。您可以使用
df2%mutate(time=ymd_hms(time))从文件中恢复数据帧
。如果没有
dplyr
lubridate
则为
data$time=format(data$time,format=“%FT%H:%M:%S%z”);write.csv(data,“time.csv”,row.names=FALSE)
@RubenLaguna应该发布其中一个作为解决方案。我今天有同样的问题并使用了你的答案。@bonna应该发布其中一个作为解决方案。我今天有同样的问题并使用了你的答案。
"time","quantity"
"2013-04-25T09:00:00+0200",1
df2 <- read.csv("test.csv") %>% mutate(time=ymd_hms(time))