gpt4 book ai didi

r - fwrite 更改 POSIXct 值的次数

转载 作者:行者123 更新时间:2023-12-03 23:17:35 25 4
gpt4 key购买 nike

我正在使用 fwrite 在 R 中编写一个 csv。

我注意到写入的 csv 在 POSIXct 列中具有不同的值,这些值似乎与原始值相差一小时(尽管我不确定它是否始终相差一小时或随机值)。

例如,如果我从以下数据开始(日期时间被归类为 POSIXct):
查看(测试)

身份证 |日期
---+---------------------------
01 | 2016-10-26 08:19:00
02 | 2016-10-26 09:05:00
03 | 2016-10-26 09:15:00
04 | 2016-10-26 09:15:00
05 | 2016-10-26 09:28:00


fwrite(test, file = "test.csv", quote = TRUE)

nexttest <- fread("M:\\test.csv", sep = ",", header = TRUE)
查看(下一个测试)
返回是

身份证 |日期
---+---------------------------
01 | 2016-10-26T07:19:00Z
02 | 2016-10-26T08:05:00Z
03 | 2016-10-26T08:15:00Z
04 | 2016-10-26T08:15:00Z
05 | 2016-10-26T08:28:00Z

等等等等
使用 read.table 的结果是一样的。
我想我在 fwrite 语句中遗漏了一个参数。有任何想法吗?

sessionInfo()    
R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United
Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C

[5] LC_TIME=English_United Kingdom.1252


dput(head(test))
Date.Created = structure(c(1477919160, 1477915320, 1477936980,
1477919820, 1477917780, 1477909680), class = c("POSIXct",
"POSIXt"), tzone = "")

最佳答案

dateTimeAs ?fwrite 的论据:

How Date/IDate, ITime and POSIXct items are written.

  • "ISO" (default) - 2016-09-12, 18:12:16 and 2016-09-12T18:12:16.999999Z. 0, 3 or 6 digits of fractional seconds are printed if and when present for convenience, regardless of any R options such as digits.secs. The idea being that if milli and microseconds are present then you most likely want to retain them. R's internal UTC representation is written faithfully to encourage ISO standards, stymie timezone ambiguity and for speed. An option to consider is to start R in the UTC timezone simply with "$ TZ='UTC' R" at the shell (NB: it must be one or more spaces between TZ='UTC' and R, anything else will be silently ignored; this TZ setting applies just to that R process) or Sys.setenv(TZ='UTC') at the R prompt and then continue as if UTC were local time.

[强调我的,见 ISO 8061 ]
您需要确保控制您的时区 POSIXct对象显示在(参见 tzas.POSIXct 参数)中并谨慎操作。
关于 R 的一些困扰我的事情是当 tzone = '' ,隐含您的 POSIXct对象已获取您的本地时区(用于打印)。为了完全明确,您可以检查您的 Sys.timezone()并将其添加到 tz声明 POSIXct 时的参数对象,然后使用 attr(Date, 'tzone') = 'UTC'将其转换为UTC。
在您的机器上比较以下输出:
t = Sys.time()
t
attr(t, 'tzone') = 'UTC'
t
# [1] "2017-11-09 10:43:59 UTC"
所以,如果你这样做:
attr(test$Date, 'tzone') = 'UTC'
test$Date
您应该看到这与 fwrite 产生的输出相匹配。 .
您可以检查 print.POSIXct 的代码和 format.POSIXct并查看 unclass(t)设置前后 attr(t, 'tzone') = 'UTC'说服自己所有时区的使用都是肤浅的——R 中日期时间对象的内部表示总是“自纪元以来的秒数”,它只是 print/ format应用时区差异并影响您在打印时看到的对象表面的方法。

关于r - fwrite 更改 POSIXct 值的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47199428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com