R 尝试反向转换时区向量

R 尝试反向转换时区向量,r,posixct,R,Posixct,我有一个时间戳数据库(AlertTime),我知道这些时间戳在哪个时区(时区)。我知道如何将这些日期设置为POSIXCT,或者如果它们都是UTC,但我很难将它们标识为它们的本地时间戳,因为大多数函数不接受tz的向量 我确实需要正确格式化的本地时间戳(AlertTimeLocal)和UTC等效时间(AlertTimeUTC) 我正在使用此代码,但它似乎不再起任何作用: FreshAir$AlertTimeLocal <- mapply(function(x,y) {format(x, tz=

我有一个时间戳数据库(AlertTime),我知道这些时间戳在哪个时区(时区)。我知道如何将这些日期设置为POSIXCT,或者如果它们都是UTC,但我很难将它们标识为它们的本地时间戳,因为大多数函数不接受tz的向量

我确实需要正确格式化的本地时间戳(AlertTimeLocal)和UTC等效时间(AlertTimeUTC)

我正在使用此代码,但它似乎不再起任何作用:

FreshAir$AlertTimeLocal <- mapply(function(x,y) {format(x, tz=y, usetz=TRUE)}, FreshAir$AlertTime, FreshAir$TimeZone)

FreshAir$AlertTimeLocal我们可以从
lubridate

library(lubridate)
library(dplyr)
df1 %>%
    mutate(AlertTimeLocal = dmy_hm(AlertTime), 
           AlertTimeUTC = force_tzs(AlertTimeLocal, tzones = TimeZone))
# AlertTime            TimeZone      AlertTimeLocal        AlertTimeUTC
#1 11 May 2020, 06:22 PM      America/Denver 2020-05-11 18:22:00 2020-05-12 00:22:00
#2 11 MAY 2020, 04:11 AM America/Los_Angeles 2020-05-11 04:11:00 2020-05-11 11:11:00
#3 10 MAY 2020, 03:38 PM     America/Chicago 2020-05-10 15:38:00 2020-05-10 20:38:00
更新 如果我们需要存储为单独的时区,我们可以使用
列表

library(purrr)
df2 <- df1 %>%
         mutate(AlertTime2 = dmy_hm(AlertTime), 
         AlertTimeUTC = force_tzs(AlertTime2, tzones = TimeZone), 
         AlertTimeLocal = map2(AlertTime2, TimeZone, ~ force_tz(.x, tzone = .y))) 


df2$AlertTimeLocal
#[[1]]
#[1] "2020-05-11 18:22:00 MDT"

#[[2]]
#[1] "2020-05-11 04:11:00 PDT"

#[[3]]
#[1] "2020-05-10 15:38:00 CDT"
库(purrr)
df2%
突变(AlertTime2=dmy_hm(AlertTime),
AlertTimeUTC=force_tzs(AlertTime2,tzones=时区),
AlertTimeLocal=map2(AlertTime2,时区,~force_tz(.x,tzone=.y)))
df2$AlertTimeLocal
#[[1]]
#[1] “2020-05-11 18:22:00 MDT”
#[[2]]
#[1] “2020-05-1104:11:00太平洋标准时间”
#[[3]]
#[1] “2020-05-1015:38:00CDT”
数据
df1我认为一个整洁的解决方案可能看起来更干净,但是如果你想要一个基本的R解决方案,这里有一个使用@akrun的
df1
的替代方案:


df1$AlertTimeLocal您可以尝试
force_tzs(dmy_hm(FreshAir$AlertTime),tzones=FreshAir$TimeZone)
数据中的列名和代码列名不匹配如果您错过了我的答案编辑,请注意,您不能(轻松地)在一列中拥有不同的本地时区。(1)在我的回答中,这可能更适合作为一个评论。(2) 我在回答中指出,在一个向量中不能有不同的区域。您的答案描述了一天中所需的时间,但它们不是OP要求的时间:
AlertTimeLocal
的时区是UTC,而不是OP要求的MDT、PDT和CDT。诚然,OP应该接受答案,但所要求的不会发生(那么容易)。要了解我的意思,请尝试
mutate(AlertTimeLocal=format(AlertTimeLocal,format=“%Y-%m-%d%H:%m:%S%Z”)
。谢谢,不过您的未经mutate的版本似乎运行良好。另外
FreshAir$AlertTime_UTC@Adam是的,它应该可以工作。我使用了
mutate
,因为这样可以更容易地扩展该链,以防出现错误。想要。因为OP中引用了
“MDT”
。它只是一个占位符,提醒OP不能(轻松地)在列的每个元素中获得不同的时区。我不知道如何更好地这样说:在一个简单的向量(列)中,R不允许单个元素使用不同的时区。
“tzone”
的属性作为一个整体应用于向量。因此OP中每一行可以有不同的本地时区的前提是有缺陷的(假设是向量/列而不是列表列)。你能在你的数据中得到不同的区域吗?我知道那部分。但是,我很好奇为什么你选择本地作为一个特定的参考,因为我在OP的帖子中没有找到关于该参考的内容。问题是正确的:
AlertTimeLocal(desired)
在标题行,而
2020-05-11 18:22:00 MDT
在下一行。然后是CDT和PDT。我只是用第一行,部分是为了说明我的观点。是的,那是第一行,但后来是CDT,所以不清楚
library(purrr)
df2 <- df1 %>%
         mutate(AlertTime2 = dmy_hm(AlertTime), 
         AlertTimeUTC = force_tzs(AlertTime2, tzones = TimeZone), 
         AlertTimeLocal = map2(AlertTime2, TimeZone, ~ force_tz(.x, tzone = .y))) 


df2$AlertTimeLocal
#[[1]]
#[1] "2020-05-11 18:22:00 MDT"

#[[2]]
#[1] "2020-05-11 04:11:00 PDT"

#[[3]]
#[1] "2020-05-10 15:38:00 CDT"
df1 <- structure(list(AlertTime = c("11 May 2020, 06:22 PM",
       "11 MAY 2020, 04:11 AM", 
"10 MAY 2020, 03:38 PM"), TimeZone = c("America/Denver", 
"America/Los_Angeles", 
"America/Chicago")), class = "data.frame", row.names = c(NA, 
-3L))