我从csv文件(从.xlsx转换而来)导入了fread
的数据帧。导入后,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中错误的时间戳?
如何准确处理?
答案 0 :(得分:1)
我会按照@ alistaire的建议来设置从字符串解析时的时区。事实上,这似乎发生在
之后
attr(inputData$timestamp, "tzone")
是""
之后,""
是默认设置数据到您当地的时区。
问题是,在as.Date
使用POSIXct
类输入时,tz
的默认值为"UTC"
,而不是您当地的时区。得到你想要的:
"UTC"
as.Date(inputData$timestamp, tz="")
。split
醇>
为了说明,我们说数据是:
inputData<- structure(list(timestamp = structure(c(1473048000, 1473051600,
1473055200, 1473058800, 1473062400, 1473066000, 1473069600, 1473073200,
1473076800, 1473080400, 1473084000, 1473087600, 1473091200, 1473094800,
1473098400, 1473102000, 1473105600, 1473109200, 1473112800, 1473116400,
1473120000, 1473123600, 1473127200, 1473130800, 1473134400, 1473134460,
1473134520, 1473134580), class = c("POSIXct", "POSIXt"), tzone = ""),
value = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L)), .Names = c("timestamp", "value"), row.names = c(NA,
-28L), class = "data.frame")
## timestamp value
##1 2016-09-05 00:00:00 0
##2 2016-09-05 01:00:00 0
##3 2016-09-05 02:00:00 0
##4 2016-09-05 03:00:00 0
##5 2016-09-05 04:00:00 0
##6 2016-09-05 05:00:00 0
##7 2016-09-05 06:00:00 0
##8 2016-09-05 07:00:00 0
##9 2016-09-05 08:00:00 0
##10 2016-09-05 09:00:00 0
##11 2016-09-05 10:00:00 0
##12 2016-09-05 11:00:00 0
##13 2016-09-05 12:00:00 0
##14 2016-09-05 13:00:00 0
##15 2016-09-05 14:00:00 0
##16 2016-09-05 15:00:00 0
##17 2016-09-05 16:00:00 0
##18 2016-09-05 17:00:00 0
##19 2016-09-05 18:00:00 0
##20 2016-09-05 19:00:00 0
##21 2016-09-05 20:00:00 0
##22 2016-09-05 21:00:00 0
##23 2016-09-05 22:00:00 0
##24 2016-09-05 23:00:00 0
##25 2016-09-06 00:00:00 0
##26 2016-09-06 00:01:00 0
##27 2016-09-06 00:02:00 0
##28 2016-09-06 00:03:00 0
使用:
attr(inputData$timestamp, "tzone")
##[1] ""
使用split
使用默认as.Date
参数执行tz
:
byDay <- split(inputData, as.Date(inputData$timestamp))
byDay[[1]]
## timestamp value
##1 2016-09-05 00:00:00 0
##2 2016-09-05 01:00:00 0
##3 2016-09-05 02:00:00 0
##4 2016-09-05 03:00:00 0
## ...
##17 2016-09-05 16:00:00 0
##18 2016-09-05 17:00:00 0
##19 2016-09-05 18:00:00 0
##20 2016-09-05 19:00:00 0
byDay[[2]]
## timestamp value
##21 2016-09-05 20:00:00 0
##22 2016-09-05 21:00:00 0
##23 2016-09-05 22:00:00 0
##24 2016-09-05 23:00:00 0
##25 2016-09-06 00:00:00 0
##26 2016-09-06 00:01:00 0
##27 2016-09-06 00:02:00 0
##28 2016-09-06 00:03:00 0
现在,我在美国东海岸,所以我现在在美国东部时间。这就是为什么22:00:00
这里是split
到UTC的第二天的原因。使用split
执行相同的as.Date(inputData$timestamp,tz="")
:
byDay <- split(inputData, as.Date(inputData$timestamp,tz=""))
byDay[[1]]
## timestamp value
##1 2016-09-05 00:00:00 0
##2 2016-09-05 01:00:00 0
##3 2016-09-05 02:00:00 0
##4 2016-09-05 03:00:00 0
## ...
##21 2016-09-05 20:00:00 0
##22 2016-09-05 21:00:00 0
##23 2016-09-05 22:00:00 0
##24 2016-09-05 23:00:00 0
byDay[[2]]
## timestamp value
##25 2016-09-06 00:00:00 0
##26 2016-09-06 00:01:00 0
##27 2016-09-06 00:02:00 0
##28 2016-09-06 00:03:00 0