检查是否在GMT中,然后在GMT-R-循环中转换为本地时间

检查是否在GMT中,然后在GMT-R-循环中转换为本地时间,r,lubridate,posixct,R,Lubridate,Posixct,我发现了一百万篇关于从格林尼治时间转换为当地时间的帖子,但没有一篇是首先检查日期时间是否在格林尼治时间,然后将其转换为代表性当地时间。由于人们建议复制,我希望将从格林尼治时间转换为当地时间,但更重要的是,特别想检查是否需要进行转换。我使用的是lubridate、dplyr、zoo和stringr 以这个示例数据为例(我的数据位于nums和POSXIct格式的较大数据框中): 对于存储1000,df数据帧具有时间列: Time<-c("2017-02-02 06:05:00 GMT", "2

我发现了一百万篇关于从格林尼治时间转换为当地时间的帖子,但没有一篇是首先检查日期时间是否在格林尼治时间,然后将其转换为代表性当地时间。由于人们建议复制,我希望将从格林尼治时间转换为当地时间,但更重要的是,特别想检查是否需要进行转换。我使用的是lubridate、dplyr、zoo和stringr

以这个示例数据为例(我的数据位于nums和POSXIct格式的较大数据框中):

对于
存储1000
df
数据帧具有
时间列

Time<-c("2017-02-02 06:05:00 GMT", "2017-02-04 00:06:10 GMT", "2017-02-05 00:06:15 GMT")
df<-as.data.frame(Time)
我目前的尝试如下:

correct_to_local_time<-function(df){     
    if("GMT" %in% df$Time){
        df$Time<-as.POSIXct(df$Time, tz ="GMT",usetz=TRUE) 
        df$Time<-with_tz(df$Time,tz=time_zone_info$timezone)
        }
    else{
           as.POSIXct(df$Time)}
}
correct_to_local_time(df)
理想情况下,我想要的是:

 Local Time        
2017-02-02 01:05:00 EDT
2017-02-04 01:10:00 EDT
2017-02-05 01:15:00 EDT
一旦从GMT转换为EDT或MST,是否考虑夏令时


提前感谢您,您的软件包可能会对您有所帮助

 require(lubridate)

dfTime<-c("2017-02-02 06:05:00 GMT", 
          "2017-02-04 00:06:00 New_York",
          "2017-02-05 00:06:00 US/Mountain")
dfStore <-c(1000, 2000, 3000)
dftimeZone<-c("US/Eastern", "US/Eastern", "US/Mountain")

time_zone_info <- data.frame(Store = dfStore,
                             Time = dfTime,
                             Timezone = dftimeZone,
                             stringsAsFactors = FALSE)
好的,很好

接下来,将时间字符串转换为POSIXct。我喜欢lubridate函数“ymd_hms”,因为它非常灵活。您还可以使用参数“tz”设置时区。这将返回当前时区中的时间。例如,我在西雅图,因此这将返回我的等效时间(PST)。我很确定lubridate的账户是夏令时。(我很难将此消息传递给sapply,因此选择了“for”循环。不过,我相信其他人可以在没有此消息的情况下实现这一点。)


time\u zone\u info$Time2该软件包
lubridate
可能会对您有所帮助

 require(lubridate)

dfTime<-c("2017-02-02 06:05:00 GMT", 
          "2017-02-04 00:06:00 New_York",
          "2017-02-05 00:06:00 US/Mountain")
dfStore <-c(1000, 2000, 3000)
dftimeZone<-c("US/Eastern", "US/Eastern", "US/Mountain")

time_zone_info <- data.frame(Store = dfStore,
                             Time = dfTime,
                             Timezone = dftimeZone,
                             stringsAsFactors = FALSE)
好的,很好

接下来,将时间字符串转换为POSIXct。我喜欢lubridate函数“ymd_hms”,因为它非常灵活。您还可以使用参数“tz”设置时区。这将返回当前时区中的时间。例如,我在西雅图,因此这将返回我的等效时间(PST)。我很确定lubridate的账户是夏令时。(我很难将此消息传递给sapply,因此选择了“for”循环。不过,我相信其他人可以在没有此消息的情况下实现这一点。)


time\u zone\u info$Time2让我们从制作一个data.frame开始,这个data.frame更接近您实际使用的数据,也比向函数提交一行数据的一列data.frame更容易使用

df <- data.frame(
      Store = c(1000, 2000, 3000),
      Time = c("2017-02-02 06:05:00 GMT",
               "2017-02-04 00:06:10 GMT",
               "2017-02-05 00:06:15 GMT"),
      stringsAsFactors = FALSE)

如果我是你,我也会严格检查函数的
else
部分是否返回你想要的;我可以看到不使用非标准时区信息的情况。

让我们先制作一个data.frame,它更接近您实际使用的数据,也比您向函数提交一行数据的一列data.frame更容易使用

df <- data.frame(
      Store = c(1000, 2000, 3000),
      Time = c("2017-02-02 06:05:00 GMT",
               "2017-02-04 00:06:10 GMT",
               "2017-02-05 00:06:15 GMT"),
      stringsAsFactors = FALSE)

如果我是你,我也会严格检查函数的
else
部分是否返回你想要的;我可以看出不使用非标准时区信息。

这不是创建了一个列表吗?我想保持我的数据帧格式——这是一堆矢量,可能是Thanke@Mako212的副本,但这似乎并不相关。请看,我正在从GMT转换,需要包含一个检查功能。两个数据帧中都有存储ID吗?如果你这样做了,你应该能够基于商店ID加入,然后从时间/时区列构造你的时间对象。我逐个迭代每个storeID,因此为每次迭代生成时区信息。这不是创建了一个列表吗?我想保持我的数据帧格式——这是一堆矢量,可能是Thanke@Mako212的副本,但这似乎并不相关。请看,我正在从GMT转换,需要包含一个检查功能。两个数据帧中都有存储ID吗?如果你这样做了,你应该能够基于商店ID加入,然后从时间/时区列构造你的时间对象。我逐个迭代每个storeID,因此为每次迭代生成时区信息。谢谢!事实上,我只是为了清晰起见对它进行了更新,并更改了我的方法,这样它就不会抛出错误,但仍然无法进行计算-谢谢你的帮助:)它看起来像是在将时区从GMT更改为EDT(耶!),但没有更改时间本身,我认为这是不正确的。嗯。。。编辑之后,我并不清楚示例函数是如何工作的,因为您还没有定义什么是
df
。我更新了
df
函数,而不是
time,因此它应该是正确的-捕捉得很好。在每次迭代中,
time\u zone\u info
中只有一行,因此
time\u zone\u info$timezone
应始终正确。我已经取得了一些进展(使用format函数在不同的时区显示时间),但是我对“GMT”子字符串的检查不太正常(现在应该更新)LauraS谢谢!事实上,我只是为了清晰起见对它进行了更新,并更改了我的方法,这样它就不会抛出错误,但仍然无法进行计算-谢谢你的帮助:)它看起来像是在将时区从GMT更改为EDT(耶!),但没有更改时间本身,我认为这是不正确的。嗯。。。编辑之后,我并不清楚示例函数是如何工作的,因为您还没有定义什么是
df
。我更新了
df
函数,而不是
time,因此它应该是正确的-捕捉得很好。在每次迭代中,
time\u zone\u info
中只有一行,因此
time\u zone\u info$timezone
应始终正确。我已经取得了一些进展(使用format函数在不同的时区显示时间),但我的“GMT”子字符串检查不起作用
time_zone_info$Time2 <- as.POSIXct(NA)
for(i in 1:nrow(time_zone_info)){
      time_zone_info$Time2[i] <- ymd_hms(time_zone_info$Time[i], 
                                         tz = time_zone_info$Timezone[i])
}
df <- data.frame(
      Store = c(1000, 2000, 3000),
      Time = c("2017-02-02 06:05:00 GMT",
               "2017-02-04 00:06:10 GMT",
               "2017-02-05 00:06:15 GMT"),
      stringsAsFactors = FALSE)
time_zone_info <- data.frame(
      Store = 1000,
      timezone = "US/Eastern",
      stringsAsFactors = FALSE)
require(stringr)
require(lubridate)

correct_to_local_time<-function(InputTime){     
      if(str_detect(InputTime, "GMT")){
            GMTTime <- as.POSIXct(InputTime, tz = "GMT", usetz = TRUE) 
            OutputTime <- with_tz(GMTTime, tz = time_zone_info$timezone)
      } else {
            OutputTime <- as.POSIXct(InputTime)}

      return(OutputTime)
}
correct_to_local_time(df$Time[1])