初始化的 POSIXct 值与 R 中的打印值不同
initialized POSIXct value different from printed values in R
下面,我写了一个小代码来比较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 不同,或者当我直接转换它时?我认为这与初始化列有关,但我不知道为什么会这样。有什么想法吗?
确实与初始化列有关。原因是 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"
这里,最终的结果不依赖于最初选择的时区。
您的示例代码的最后几行对应于相同的情况:您没有将时间戳分配给另一个已经预先配置了时区的向量,因此没有发生转换。
下面,我写了一个小代码来比较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 不同,或者当我直接转换它时?我认为这与初始化列有关,但我不知道为什么会这样。有什么想法吗?
确实与初始化列有关。原因是 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"
这里,最终的结果不依赖于最初选择的时区。
您的示例代码的最后几行对应于相同的情况:您没有将时间戳分配给另一个已经预先配置了时区的向量,因此没有发生转换。