【发布时间】:2016-10-24 15:14:11
【问题描述】:
我有一个使用 fread 从 csv 文件(从 .xlsx 转换而来)导入的数据框。导入后,class(inputData$timestamp) 为 Posixct,attr(inputData$timestamp, "tzone") 为 ""。
正如this 线程中所解释的,我正在尝试按天拆分数据帧,但它们在凌晨 2 点被拆分:
byDay <- split(inputData, as.Date(inputData$timestamp))
> byDay[[1]]
timestamp value
1 2016-09-05 00:01:00 0
2 2016-09-05 00:02:00 0
3 2016-09-05 00:03:00 0
[...]
118 2016-09-05 01:58:00 0
119 2016-09-05 01:59:00 0
>byDay[[2]]
timestamp value
120 2016-09-05 02:00:00 0
121 2016-09-05 02:01:00 0
122 2016-09-05 02:02:00 0
[...]
1558 2016-09-06 01:58:00 0
1559 2016-09-06 01:59:00 0
等等。
我了解日期与时间戳上显示的日期隐含不同:
> byDay[[1]]$timestamp[1]
"2016-09-05 00:01:00"
> as.Date(byDay[[1]]$timestamp[1])
"2016-09-04"
我对时区不感兴趣,所以我尝试将所有日期设置为 UTC:
> attr(inputData$timestamp, "tzone") <- "UTC"
> byDay <- split(inputData, as.Date(inputData$timestamp))
> byDay[[1]]
timestamp apAvg
1 2016-09-04 22:01:00 0
2 2016-09-04 22:02:00 0
3 2016-09-04 22:03:00 0
[...]
117 2016-09-04 23:57:00 0
118 2016-09-04 23:58:00 0
119 2016-09-04 23:59:00 0
这意味着时间戳实际上从 22:00 开始。但是在 csv 文件中,第一个时间戳是05.09.2016 00:00:00,我看不到时区格式的迹象。
时区问题是否仍有可能来自 csv 文件?
还是我在 R 中处理错误的时间戳?
如何准确处理?
【问题讨论】:
-
当你从字符串解析到 POSIXct 时,这是你真正应该解决的问题,而不是事后,或者你是否正在更改时区(即调整时间)变得非常模棱两可或者只是切换它(即更改数据)。而是在
as.POSIXct中指定tz或您正在使用的任何解析函数。 -
请参阅minimal reproducible example,了解如何在 SO 上提问。如果您的输入(或其缩减版)是 X,则显示
dput(X)的输出。 -
@alistaire Setting
tz = ""inas.POSIXct解决了它。在解析时而不是稍后获得正确时区的更一致的方法。谢谢。 -
@G.Grothendieck 感谢您的提醒。但是我不能在这里发布 csv 文件,所以我不知道如何为其他人提供示例输入来重现问题。
-
如果足够,显示
dput(InputData)或dput(head(InputData))的输出。
标签: r csv datetime posixct timestamp-with-timezone