R:数据表。如何使用 fwrite 正确保存日期?

标签 r date datetime data.table posixct

我有一个数据集。我可以选择从 Stata 文件或 SPSS 文件将其加载到 R 上。
在这两种情况下,它都使用 Haven 包正确加载。
日期被正确识别。
但是当我使用 data.table 的 fwrite 函数将它保存到磁盘时。fwrite(ppp, "ppp.csv", sep=",", col.names = TRUE) 我有一个问题,日期消失并转换为不同的数字。例如,日期 1967-08-06 在 csv 文件中保存为 -879
我也尝试过使用 fwrite 选项,例如 quote=FALSE,但没有成功。
我上传了一小部分文件样本、spss、stata 和保存的 csv。
这是代码,以便为您做事更轻松。

library(haven)
library(data.table)
ppp <- read_sav("pspss.sav") # choose one of these two.
ppp <- read_dta("pstata.dta")  # choose one of these two.
fwrite(ppp, "ppp.csv",  sep=",", col.names = TRUE) 
真正的整张表有一千多个变量和一百万个人。这就是为什么我想用一种快速的方式来做事。
http://www73.zippyshare.com/v/OwzwbyQq/file.html
这是给@ArtificialBreeze的:
> head(my)
# A tibble: 6 x 9
  ID_2006_2011              TIS FECHA_NAC_2006    año2006 Edad_31_12_2006 SEXO_2006
         <dbl>            <chr>         <date>     <date>           <dbl>     <chr>
1  1.60701e+11 BBNR670806504015     1967-08-06 2006-12-31              39         M
2  1.60701e+11 BCBD580954916014     1958-09-14 2006-12-31              48         F
3  1.60701e+11 BCBL451245916015     1945-12-05 2006-12-31              61         F
4  1.60701e+11 BCGR610904916012     1961-09-04 2006-12-31              45         M
5  1.60701e+11 BCMR580148916015     1958-01-08 2006-12-31              48         F
6  1.60701e+11 BCMX530356917018     1953-03-16 2006-12-31              53         F
# ... with 3 more variables: PAIS_NAC_2006 <dbl>, FECHA_ALTA_TIS_2006 <date>,
#   FECHA_ALTA_TIS_2006n <date>

最佳答案

由于这个问题是在 6 个月前提出的,fwrite已改进并已发布到 CRAN。我相信它现在应该可以按您的意愿工作;即快速、直接和方便的日期格式化。它现在有 dateTimeAs参数如下,复制自 fwrite 's manual page v1.10.0 现在在 CRAN 上。随着时间的推移,请查看最新版本的手册页。

====
dateTimeAs :日期/IDate、ITime 和 POSIXct 项目的编写方式。

  • “ISO”(默认) - 2016-09-12 , 18:12:162016-09-12T18:12:16.999999Z . 0、3 或 6 位小数秒会在出现时打印,以方便起见,而不管任何 R 选项(例如 digits.secs)。这个想法是,如果存在毫秒和微秒,那么您很可能希望保留它们。 R 的内部 UTC 表示是忠实地编写的,以鼓励 ISO 标准、阻止时区模糊和速度。要考虑的一种选择是在 UTC 时区中启动 R,只需在 shell 中使用“$ TZ='UTC' R”(注意:它必须是 TZ='UTC' 和 R 之间的一个或多个空格,其他任何内容都将被静默忽略;此 TZ 设置仅适用于该 R 进程)或 R 提示符处的 Sys.setenv(TZ='UTC'),然后继续,就好像 UTC 是本地时间一样。
  • “ Squash ” - 20160912 , 18121620160912181216999 .此选项允许使用整数 div 和 mod 操作快速简单地提取 yyyy、mm、dd 和(最常见的分组依据)yyyymm 部分。例如,在 R 中,一个行辅助函数可以分别使用 %/%10000、%/%100%%100、%%100 和 %/%100。 POSIXct UTC 被压缩为 17 位数字(包括 3 位毫秒数,即使是 000),可以舒适地读取为 integer64(由 fread() 自动)。
  • 《时代》 - 17056 , 655361473703936.999999 .自相关纪元(分别为 1970-01-01、00:00:00 和 1970-01-01T00:00:00Z)以来的基础天数或秒数,在此之前为负数(参见 ?Date)。如果存在,则打印 0、3 或 6 位小数秒。
  • "write.csv" - 这目前仅影响 POSIXct。它通过使用 as.character 方法编写为 write.csv,该方法注意 digits.secs 并将 R 的内部 UTC 表示转换回该历史日期的本地时间(或“tzone”属性)。因此,这可能很慢。所有其他列类型(包括独立于时区的 Date、IDate 和 ITime)都使用已与 write.csv 一致的快速 C 代码编写为“ISO”选项。

  • 由于新的专用 C 代码,前三个选项很快。纪元到日期部分的转换使用 Howard Hinnant 的快速方法(参见引用资料),使用从 3 月 1 日开始的一年中的一天。您应该不会注意到这三个选项之间的写入速度有任何差异。 Date 和 IDate 支持的日期范围是 [0000-03-01, 9999-12-31]。这 3,652,365 个日期中的每一个都经过测试,并与基准 R 进行了比较,包括该范围内的所有 2,790 个闰日。此选项也适用于列表列单元格中的日期/时间向量。不支持完全灵活的格式字符串(例如“%m/%d/%Y”)。这是为了鼓励使用 ISO 标准,并且因为不知道如何在 C 级快速实现这种灵 active 。如果需要,我们可能能够支持一两个更具体的选项。

    ====

    关于R:数据表。如何使用 fwrite 正确保存日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38379183/

    相关文章:

    java - 将字符串格式的日期插入到字段类型为日期的数据库中

    datetime - ISO 8601 重复间隔

    python - Pyspark - 将 mmddyy 转换为 YYYY-MM-DD

    减少 RMarkdown/Quarto 中命令和输出之间的空间

    c++ - 在 R 中使用 C++ 编译错误 : "RcppArmadillo.h: No such file or directory"

    mysql - 按日和/或月和/或年检索记录的最有效方法是什么?

    javascript - 日期格式 "\/Date(1394841600000)\/"?(以滴答为单位)

    c# - 测量代码执行时间

    r - 仅在 R 中的 ANOVA 循环上打印显着结果

    r - 将 stat_summary 与 ggplot 一起使用时更改条宽