R通过POSIXct函数中的tz传递字符串向量

标签 r vector timezone posixct

我试图通过 POSIXct() 传递两个向量。 GMTDteTmeStamp 是我的 GMT 时间列表,TZ 是我需要将 GMT 时间转换成相应本地时区的列表。我尝试了多种传递 TZ 的方法,但我没有得到任何结果。

数据:

> GMTDteTmeStamp
 [1] 43138.5 43139.5 43168.5 43169.5 43170.5 43171.5 43172.5 43141.5 43142.5 43143.5 43144.5 43176.5
[13] 43177.5 43178.5
> TZ
 [1] "Europe/London"       "America/New_York"    "America/Chicago"     "America/Chicago"    
 [5] "America/Chicago"     "America/Chicago"     "America/Chicago"     "America/Phoenix"    
 [9] "America/Los_Angeles" "Europe/Madrid"       "America/Santiago"    "America/Sao_Paulo"  
[13] "America/Sao_Paulo"   "America/Sao_Paulo"  

代码:(我正在尝试 with_tzPOSIXct 看看我是否可以工作。)

  TZX <- TZDC[,1]
  GMTDteTmeStamp <- (TD[,2]) ## get GMT time to be converted
  GMTDteTmeStamp <- as.double(unlist(GMTDteTmeStamp), options(digits = 6)) 
  GMTDteTmeValue <- as.POSIXct((GMTDteTmeStamp) * 86400
                               , origin = as.POSIXct("1899-12-30", tz = "UTC")
                               , tz = "UTC") ## Force GMT time as GMT 


  TZ <- TZX
  x <- with_tz(GMTDteTmeValue, tz = TZ)
  APLDteTmeValue <- as.POSIXct((GMTDteTmeStamp) * 86400, origin = "1899-12-30", tz = TZ)

我可以手动传递 TZ 值,所以我知道那里没有问题。我得到了

Error in as.POSIXlt.POSIXct(x, tz) : invalid 'tz' value

感谢您的协助。

最佳答案

所以事实证明你不能通过 tz 传递列表或向量。我还发现单个列不能有多个 tz 与其关联。不知道为什么会这样,但我确实为将来遇到此问题的任何人找到了解决方法。

我首先使用循环将可变时区名称传递给 tz 以获取记录位置的正确本地时间。然后我通过另一个带有 force_tz 的变量来强制使用“GMT”时区的本地时间。这使我在“本地时间”列中的时间能够正确读取,即使 R 认为它们是 GMT 时间。

有关本地时间列的注释。确保您将其设置为 .POSIXct(.., tz = "UTC") 否则该列会将您的所有时间转换为系统本地时间。

这是将 GMT 时间转换为本地时间的最终代码。请注意,我有一个包含所有机场代码和相应时区名称的数据文件。

library(readxl)
library(data.table)
library(plyr)
library(tidyr)
library(dplyr)
library(tibble)
library(fastmatch)
library(stringr)
library(magrittr)
library(RcppBDT)
library(lubridate)
library(openxlsx)
##library(anytime)

## Load time zone data sheet
TZData  <- read_excel("TZDataFile.xlsx")
TZData <- as.data.table(TZData)
TZRange <- TZData[,1]
TZRange <- as.data.frame(TZRange)

##Bring in test data
TD  <- read_excel("Test dates.xlsx", col_types = c("text", "text"))
TD <- as.data.table(TD)

####Start Time Conversion Code####

## Define variables
Station <- TD[,1] ##Station
GMT <- TD[,2] ##Date/time stamp in GMT to be converted to local
z <- nrow(TD)+0

STA <- as.data.frame(Station[,1]) ## Get Station
APCode <- fmatch(STA[,1],TZRange[,1]) ## Match station on Time Zone Data sheet
TZDC <- as.data.frame(TZData[APCode,3])
TZX <- TZDC[,1]
GMTDteTmeStamp <- (TD[,2]) ## get GMT time to be converted
GMTDteTmeStamp <- as.double(unlist(GMTDteTmeStamp), options(digits = 6))
GMTDteTmeValue <- as.POSIXct((GMTDteTmeStamp) * 86400
                             , origin = as.POSIXct("1899-12-30", tz = "UTC")
                             , tz = "UTC") ## Force GMT time as GMT
TD <- add_column(TD,GMTDteTmeValue)
LT <- .POSIXct(double(z), tz = "UTC")
TD <- add_column(TD, LT )

for (i in 1:z){
  TZ <- TZDC[i,1]
  LclDteTmeValue <- with_tz(GMTDteTmeValue[i], TZ)
  LclGMT <- force_tz(LclDteTmeValue, tzone = "UTC" )
  TD[i,4] <-LclGMT
}

 > TD
    Sta          GMT Dept      GMTDteTmeValue                  LT
 1: LHR 43183.51666666667 2018-03-24 12:24:00 2018-03-24 12:24:00
 2: LHR 43184.51666666667 2018-03-25 12:24:00 2018-03-25 13:24:00
 3: PHL 43169.51666666667 2018-03-10 12:24:00 2018-03-10 07:24:00
 4: PHL 43170.51666666667 2018-03-11 12:24:00 2018-03-11 08:24:00
 5: DFW 43169.51666666667 2018-03-10 12:24:00 2018-03-10 06:24:00
 6: DFW 43170.51666666667 2018-03-11 12:24:00 2018-03-11 07:24:00
 7: PHX 43169.51666666667 2018-03-10 12:24:00 2018-03-10 05:24:00
 8: PHX 43170.51666666667 2018-03-11 12:24:00 2018-03-11 05:24:00
 9: LAX 43169.51666666667 2018-03-10 12:24:00 2018-03-10 04:24:00
10: LAX 43170.51666666667 2018-03-11 12:24:00 2018-03-11 05:24:00
11: BCN 43183.51666666667 2018-03-24 12:24:00 2018-03-24 13:24:00
12: BCN 43184.51666666667 2018-03-25 12:24:00 2018-03-25 14:24:00
13: SCL 43317.51666666667 2018-08-05 12:24:00 2018-08-05 08:24:00
14: SCL 43318.51666666667 2018-08-06 12:24:00 2018-08-06 08:24:00
15: GIG 43176.51666666667 2018-03-17 12:24:00 2018-03-17 09:24:00
16: GIG 43177.51666666667 2018-03-18 12:24:00 2018-03-18 09:24:00

关于R通过POSIXct函数中的tz传递字符串向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48774156/

相关文章:

r - 将背景颜色设置为 corrplot 中数据的强度

r - 如何从R中的随机森林中提取if-then规则?

C++ 将大量 vector 加倍转换为字符 vector 的最有效方法

c++ - 在 C++ 中,可以在不破坏原始对象的情况下按值传递临时对象吗?

c++ - 处理夏令时 - C++

r - 在R/Splus中编写初始化参数的函数

r - 从 R 中为另一种编程语言创建脚本文件(将包含许多特殊字符的长文本写入文件)

c++ - 这个 std::vector 构造函数中发生了什么?

java - Joda-Time 日期时间 欧洲/柏林夏令时

postgresql - 您可以从 Postgresql TIMESTAMP WITH TIME ZONE 字段中恢复完整的时区名称吗?