如何更改数据框中的时区?

How to change a time zone in a data frame?

我正在使用

将 csv 加载到数据框中
str <- readLines("Messages.csv", n=-1, skipNul=TRUE)
matches <- str_match(str, pattern = "\s*([0-9]{2}/[0-9]{2}/[0-9]{4}),\s*([0-9]{2}:[0-9]{2}:[0-9]{2}),\s*(Me|Them),\s*(\+[0-9]{11,12}),\s*((?s).*)")
df <- data.frame(matches[, -1], stringsAsFactors=F)
colnames(df) <- c("date","time","sender","phone number","msg")


# Format the date and create a row with the number of characters of the messages
df <- df %>%
mutate(posix.date=parse_date_time(paste0(date,time),"%d%m%y%H%M%S"),tz="Europe/London") %>%           
 mutate(nb.char = nchar(msg)) %>%
 select(posix.date, sender, msg, nb.char) %>%
 arrange(as.numeric(posix.date))

我可以使用

更改发件人姓名
# Change the senders' names
df <- df %>%
  mutate(sender = replace(sender, sender == "Me", "Mr. Awesome")) 

但我想将数据的时区从更改为 tz="America/Los_Angeles"

我尝试了以下两种方法都没有成功:

attributes(df)$tz<-"America/Los_Angeles"

此编译但似乎没有任何改变

还有这个:

df <- df %>%
mutate(date = replace(date, format(date, tz="America/Los_Angeles",usetz=TRUE)))

给出错误:"Error in eval(expr, envir, enclos) : argument "values" is missing, with no default"

也许我没有正确指定原始时区,但我真的不知道如何检查它是否通过了。

谢谢!

首先,您可以更改 POSIXct 变量的时区。它对 "change the time zone in a data.frame" 没有意义,因此设置 data.frame 的 "tz" 属性没有任何作用。

[ 注意:然而,更改xts对象的时区是有意义的。参见 this post。 ]

我了解到您的时间戳是格林威治标准时间,您想将其转换为太平洋标准时间的等效时间。如果这是您想要的,那么这应该有效:

df$posix.date <- as.POSIXct(as.integer(df$posix.date),
                            origin="1970-01-01", 
                            tz="American/Los_Angeles")

例如:

x <- as.POSIXct("2015-01-01 12:00:00", tz="Europe/London")
x
# [1] "2015-01-01 12:00:00 GMT"
as.POSIXct(as.integer(x),origin="1970-01-01",tz="America/Los_Angeles")
# [1] "2015-01-01 04:00:00 PST"

这里的问题是 as.POSIXct(...) 的工作方式不同,具体取决于传递给它的对象的 class。如果传递字符或整数,则时区根据tz=...设置。如果您传递一个已经是 POSIXct 的对象,则忽略 tz=... 参数。所以在这里我们将 x 转换为整数,因此 tz=... 参数得到尊重。

真是费解。如果有更简单的方法,我很想听听。