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

Fra*_*ank 6 timezone r

我正在使用将 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))
Run Code Online (Sandbox Code Playgroud)

我可以使用更改发件人姓名

# Change the senders' names
df <- df %>%
  mutate(sender = replace(sender, sender == "Me", "Mr. Awesome")) 
Run Code Online (Sandbox Code Playgroud)

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

我已尝试以下两种方法均未成功:

attributes(df)$tz<-"America/Los_Angeles"
Run Code Online (Sandbox Code Playgroud)

这可以编译,但似乎没有任何改变

还有这个:

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

给出错误:“eval(expr, envir, enclos) 中的错误:参数“值”丢失,没有默认值”

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

谢谢!

jlh*_*ard 5

首先,您可以更改 POSIXct 变量的时区。“更改 data.frame 中的时区”没有意义,因此设置"tz"data.frame 的属性不会执行任何操作。

[ 注意:但是,更改 xts 对象的时区是有意义的。请参阅此帖子。]

我了解到您的时间戳采用 GMT 格式,并且您希望将其转换为 PST 格式的等效时间戳。如果这就是您的意图,那么这应该有效:

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

例如:

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"
Run Code Online (Sandbox Code Playgroud)

这里的问题是,as.POSIXct(...)根据传递给它的对象的类,它的工作方式有所不同。如果传递字符或整数,则根据 来设置时区tz=...。如果传递的对象已经是 POSIXct,则该tz=...参数将被忽略。所以这里我们转换x为整数,以便tz=...尊重参数。

确实很复杂。如果有更简单的方法,我很想听听。