How to prevent write.csv from changing POSIXct, dates and times class back to character/factors?

后端 未结 3 345
既然无缘
既然无缘 2021-01-03 04:50

I have a .csv file with one field each for datetime, date and time. Originally they are all character fields and I have converted them accordingly. At the end of my code, if

相关标签:
3条回答
  • 2021-01-03 05:20

    According to ?write.table:

    Any columns in a data frame which are lists or have a class (e.g. dates) will be converted by the appropriate 'as.character' method: such columns are unquoted by default.

    Simply put, you can only write text/characters to text files. Use save if you want to preserve the binary R representation of your object(s).

    0 讨论(0)
  • 2021-01-03 05:28

    If you are willing to add dplyr and lubridate as dependencies you can generate the CSV with dates in ISO8601 (so you don't lose any information) like this:

    #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)
    

    That will generate a CSV file with the following content:

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

    As you can see the CSV contain the date in ISO8601 with the timezone information so no information is lost.

    If you want to read back that CSV you can

    df2 <- read.csv("test.csv") %>% mutate(time=ymd_hms(time))
    
    0 讨论(0)
  • 2021-01-03 05:36

    If you want to preserve all of the time information so it can be read in again, this recipe should work:

    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)
    

    It gives the following CSV file:

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

    in which the timezone information is presented explicitly; if you apply write.csv to the original dat, the formatting is lost.

    0 讨论(0)
提交回复
热议问题