R 从csv导入的时间戳中的时区

R 从csv导入的时间戳中的时区,r,csv,datetime,posixct,timestamp-with-timezone,R,Csv,Datetime,Posixct,Timestamp With Timezone,我有一个从csv文件(从.xlsx转换而来)导入的数据帧,其中包含fread。导入后,class(inputData$timestamp)是Posixct,attr(inputData$timestamp,“tzone”)是” 正如线程中所解释的,我试图按天分割数据帧,但它们在凌晨2点被分割: byDay <- split(inputData, as.Date(inputData$timestamp)) > byDay[[1]] timestamp val

我有一个从csv文件(从.xlsx转换而来)导入的数据帧,其中包含
fread
。导入后,
class(inputData$timestamp)
Posixct
attr(inputData$timestamp,“tzone”)

正如线程中所解释的,我试图按天分割数据帧,但它们在凌晨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
我对时区不感兴趣,所以我尝试将所有日期设置为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
>attr(inputData$timestamp,“tzone”)byDay byDay[[1]]
时间戳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中处理时间戳错误?
如何准确地处理这个问题?

在从字符串解析时,我会按照@alistaire的建议设置时区。事实上,从那以后似乎就发生了这种情况

attr(inputData$timestamp,“tzone”)

然后,
是将数据设置为本地时区的默认设置

问题在于,在将
作为.Date
与类
POSIXct
输入一起使用时,
tz
的默认值是
“UTC”
,而不是您的本地时区。要获得您想要的:

  • 不要将数据的时区更改为
    “UTC”
  • 拆分中使用
    作为.Date(inputData$timestamp,tz=”“)
  • 举例来说,假设数据为:

    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
    
    使用带有默认
    tz
    参数的
    as.Date
    执行
    拆分

    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
    

    当您从字符串解析到POSIXct时,您应该真正解决这个问题,而不是在事后,或者无论您是更改时区(即也调整小时数)还是只是切换时区(即更改数据),它都变得非常模糊。相反,在
    中指定
    tz
    为.POSIXct
    或您正在使用的任何解析函数。请参阅如何就此提问。如果您的输入(或其简化版本)为X,则显示
    dput(X)
    的输出。@alistaire在
    as.POSIXct
    中设置
    tz=”“
    。还有一种更为一致的方法,可以在解析时而不是在以后获得正确的时区。谢谢。@G.Grothendieck谢谢你的提醒。但是我不能在这里发布csv文件,因此我不知道如何为其他人提供示例输入以重现问题。如果足够,请显示
    dput(InputData)
    dput(head(InputData))
    的输出。我使用了@alistaire的方法,仍然是有用的答案。
    attr(inputData$timestamp, "tzone")
    ##[1] ""
    
    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
    
    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