0

在此处输入图像描述

每一行都有不同的 origintimezone。我需要利用 origintimezone 时间中的 standardformat_new 列来创建一个新列,其中时间遵循 com_timezonenames。

简化版本将是这样的

a = ymd_hms('2017-10-10 10:20:00',tz = 'Australia/Sydney')
a
with_tz(a, tz = 'Singapore')

[![在此处输入图像描述][2]][2]

但是,当我应用与上述类似的代码时,我遇到了以下错误。

[![在此处输入图像描述][3]][3]

我曾尝试制作一个 for 循环来运行整个列表,但超过几十万的数据集使其不可行。

REPREX as reqeusted 这是我最初拥有的。

[![在此处输入图像描述][4]][4]

structure(list(com_country = c("SG", "AU", "NZ", "UK", "AU", 
"AU"), orderdate_local = c("9/20/2017 4:47:35 AM", "9/30/2017 7:00:00 AM", 
"9/20/2017 1:37:14 AM", "9/18/2017 9:38:34 PM", "9/30/2017 3:07:29 AM", 
"9/30/2017 10:17:01 AM"), origincountry = c("US", "AU", "UK", 
"AU", "AU", "AU")), .Names = c("com_country", "orderdate_local", 
"origincountry"), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

orderdate_local 在 origincountry 时区中给出,因此我需要将国家代码映射到 tz 值。

##getting origin timezone from countrycode
dd$origintimezone <- mapvalues(dd$origincountry, 
                                      from=c("AU", "UK", "US"), 
to=c("Australia/Sydney","Europe/London","America/Toronto"))

此后我需要将 orderdate_local 转换为标准 POSIXlt 格式,以便我可以使用 strptime 函数

dd$standardformat_new <- strptime(dd$orderdate_local,format="%m/%d/%Y 
%I:%M:%S %p")
dd$com_timezonenames <- mapvalues(dd$com_country, 
                      from=c("AU","MY","NZ","SG","PH","HK","UK","TH"), 
                              to=c("Australia/Sydney", "Asia/Kuala_Lumpur", "Pacific/Auckland","Asia/Singapore","Asia/Manila","Asia/Hong_Kong","Europe/London","Asia/Bangkok"))

这就是我们现在所拥有的。 在此处输入图像描述

4

3 回答 3

1

在尝试使用您的 reprex 的几个选项并在尝试强制它接受日期时间向量的不同元素的不同时区时遇到无效的“tz”值后进行编辑,我翻阅了文档以找到这一点:

R 日期时间向量不能保存具有非统一时区的元素

看起来您必须以 UTC 时间存储日期时间,这真的很令人沮丧。

下面是你如何做到这一点:

dd$standardformat_new <- force_tzs(mdy_hms(dd$orderdate_local), 
                                   tzones = dd$com_timezonenames)

上面的代码使用 lubridate 包将表示日期和时间的非标准字符向量转换为日期时间对象,将您生成的奥尔森名称时区作为输入,并生成与本地时间相对应的 UTC 时间向量在指定的时区。不幸的是,这不是那么好和可读,但它确实具有准确表示时区之间的相对时间并允许您对作为日期时间对象的向量执行进一步计算的优势。当然,您可以选择以不同的时区显示数据(只需设置tzone_out为其他时区),但所有值都必须是相同的时区。

并感谢您将reprex放在一起。我希望这有点帮助

于 2018-03-05T07:58:48.650 回答
0
        ##getting origin timezone from countrycode
        dd$origintimezone <- mapvalues(dd$origincountry, 
                               from=c("AU", "UK", "US"), 

        to=c("Australia/Sydney","Europe/London","America/Toronto"))

        ##getting com_country timezone 
        dd$com_timezonenames <- mapvalues(dd$com_country, 

        from=c("AU","MY","NZ","SG","PH","HK","UK","TH"), 
                                  to=c("Australia/Sydney", 
        "Asia/Kuala_Lumpur","Pacific/Auckland","Asia/Singapore","Asia/Manila","Asia/Hong_Kong","Europe/London","Asia/Bangkok"))




         dd$origintimezoneTIME <- force_tzs(mdy_hms(dd$orderdate_local),tzones = 
         dd$origintimezone,tzone_out = "UTC")
         dd_table <- data.table(A = 1:nrow(dd),
                       origintimezoneTIME_UTC = dd$origintimezoneTIME,
                       com_timezonenames = dd$com_timezonenames,
                       com_country = dd$com_country,
                       orderdate_local = dd$orderdate_local,
                       origincountry = dd$origincountry,
                       origintimezone = dd$origintimezone)

       dd_table[ , com_countryTIME := format(toTz(origintimezoneTIME_UTC, "UTC", 
       com_timezonenames), tz=com_timezonenames), by=A ]

在此页面的帮助下编写代码通过参考将 UTC 日期/时间调整为不同的时区lubridate

于 2018-03-07T02:39:53.433 回答
0
dl%>%
  mutate(time1 = as.POSIXct(strptime(orderdate_local,format="%m/%d/%Y %I:%M:%S %p",tz="GMT")),
         time2 = ymd_hms(unlist(lapply(seq(length(time1)),
                                       function(x) {format(with_tz(force_tz(time1[x], com_timezonenames[x]),"GMT"), "%F %T")}))),
         time3 = ymd_hms(unlist(lapply(seq(length(time2)), 
                                       function(x) {format(with_tz(time2[x], origintimezone[x]), "%F %T")}))))

另一个更简单的解决方案,没有任何花哨的库

于 2018-03-07T09:29:50.987 回答