Open tohka opened 1 year ago
Can you please provide a minimal reprex (reproducible example)? The goal of a reprex is to make it as easy as possible for me to recreate your problem so that I can fix it: please help me help you! If you've never heard of a reprex before, start by reading about the reprex package, including the advice further down the page. Please make sure your reprex is created with the reprex package as it gives nicely formatted output and avoids a number of common pitfalls.
Hi @hadley
The reprex code is presented below.
version
#> _
#> platform x86_64-w64-mingw32
#> arch x86_64
#> os mingw32
#> crt ucrt
#> system x86_64, mingw32
#> status
#> major 4
#> minor 3.1
#> year 2023
#> month 06
#> day 16
#> svn rev 84548
#> language R
#> version.string R version 4.3.1 (2023-06-16 ucrt)
#> nickname Beagle Scouts
library(readr)
packageVersion("readr")
#> [1] '2.1.4'
library(tibble)
packageVersion("tibble")
#> [1] '3.2.1'
dt <- "2000/01/01 09:00:00"
tz <- "Asia/Tokyo"
(dt.ct <- as.POSIXct(dt, tz=tz))
#> [1] "2000-01-01 09:00:00 JST"
(dt.lt <- as.POSIXlt(dt, tz=tz))
#> [1] "2000-01-01 09:00:00 JST"
(df <- data.frame(ct=dt.ct, lt=dt.lt))
#> ct lt
#> 1 2000-01-01 09:00:00 2000-01-01 09:00:00
(tbl <- tibble(ct=dt.ct, lt=dt.lt))
#> # A tibble: 1 × 2
#> ct lt
#> <dttm> <dttm>
#> 1 2000-01-01 09:00:00 2000-01-01 09:00:00
write_csv(df, "write_csv_df.csv")
readLines("write_csv_df.csv")
#> [1] "ct,lt"
#> [2] "2000-01-01T00:00:00Z,2000-01-01T00:00:00Z"
write_csv(tbl, "write_csv_tbl.csv")
readLines("write_csv_tbl.csv")
#> [1] "ct,lt"
#> [2] "2000-01-01T00:00:00Z,2000-01-01T09:00:00Z"
Please let me know if there is any other information I am missing.
Here's a somewhat more minimal reprex:
library(readr)
lt <- as.POSIXlt("2000/01/01 09:00:00", tz = "Asia/Tokyo")
df <- data.frame(lt = lt)
str(df)
#> 'data.frame': 1 obs. of 1 variable:
#> $ lt: POSIXct, format: "2000-01-01 09:00:00"
tbl <- tibble::tibble(lt = lt)
str(tbl)
#> tibble [1 × 1] (S3: tbl_df/tbl/data.frame)
#> $ lt: POSIXlt[1:1], format: "2000-01-01 09:00:00"
cat(format_csv(tbl))
#> lt
#> 2000-01-01T09:00:00Z
Created on 2023-08-01 with reprex v2.0.2
There are two issues: data.frame()
automatically turns POSIXlt
to POSIXlt
so there's no POSIXlt
in the data frame example. So write_csv()
/format_csv()
always appears to lose timezones of POSIXlt
variables.
write_csv
removes the time zone information from the POSIXlt values in tibble and appends Z to the output."2000-01-01 09:00:00 JST" equals "2000-01-01 00:00:00Z".
However, when using tibble, the POSIXlt value of "2000-01-01 09:00:00 JST" is output as "2000-01-01 09:00:00Z".