初始化的POSIXct值与R

时间:2016-01-15 21:02:06

标签: r timezone posixct

下面,我编写一个小代码来比较POSIXct输出结果和打印值。有谁知道为什么循环中的值与打印值或x变量不同?

    timezones <- data.frame(dst_start= '2012-03-11 3:00', TZname='America/Vancouver')
    timezones$TZname <- as.character(timezones$TZname)

    # Initialize the column 
    timezones$ET_DST_start <- .POSIXct(1)

    timezones$ET_DST_start[1] <- as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
    # Assigned value to dataframe
    timezones$ET_DST_start[1]
    # 
    as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
    # assigned value to a non_initialized variable
    x <- as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
    x

为什么ET_DST_start值与x不同或者我直接转换它?我认为这与初始化专栏有关,但我不知道为什么会发生这种情况。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

它确实与初始化列有关。原因是POSIXct对象带有时区属性。它不是向量的单独元素的属性,而是整个向量的属性。初始化列时,将设置该属性,如果稍后更改列的单个元素,则会转换日期以匹配该时区。

您可以看到您最初使用的时区如下:

# use UTC
timezones$ET_DST_start <- .POSIXct(1, tz = "UTC")
timezones$ET_DST_start[1] <- as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
timezones$ET_DST_start[1]
## [1] "2012-03-11 10:00:00 UTC"
# use CET
timezones$ET_DST_start <- .POSIXct(1, tz = "CET")
timezones$ET_DST_start[1] <- as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
timezones$ET_DST_start[1]
## [1] "2012-03-11 11:00:00 CET"

输出不同,您还可以看到保留最初选择的时区。如果覆盖整个列而不是其中的一个元素,则会重新设置时区:

# use UTC
timezones$ET_DST_start <- .POSIXct(1, tz = "UTC")
timezones$ET_DST_start <- as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
timezones$ET_DST_start
## [1] "2012-03-11 03:00:00 PDT"
# use CET
timezones$ET_DST_start <- .POSIXct(1, tz = "CET")
timezones$ET_DST_start <- as.POSIXct(timezones$dst_start[1], tz=timezones$TZname[1])
timezones$ET_DST_start
## [1] "2012-03-11 03:00:00 PDT"

此处,最终结果不依赖于最初的时区选择。

示例代码的最后几行对应于相同的情况:您没有将时间戳分配给另一个已预先配置时区的向量,因此不会发生转换。