我正在使用将 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) 中的错误:参数“值”丢失,没有默认值”
也许我没有正确指定原始时区,但我不知道如何检查它是否经过。
谢谢!
首先,您可以更改 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=...尊重参数。
确实很复杂。如果有更简单的方法,我很想听听。