【问题标题】:How to change a time zone in a data frame?如何更改数据框中的时区?
【发布时间】:2016-03-08 16:18:47
【问题描述】:

我正在使用将 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)))

这给出了错误:“eval(expr, envir, enclos) 中的错误:缺少参数“values”,没有默认值”

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

谢谢!

【问题讨论】:

  • 你不使用read.csv()有什么原因吗?
  • 我应该补充一点,我是 r 的新手,这里的代码基础来自这篇博文,所以大多数功能决策不是我自己的。 iwoaf.com/data-of-long-distance-lovers
  • 我认为原因是数据帧中的条目之一是消息,这些可以包含逗号,因此使用 read.csv 会分解消息并错误地解析。使用 readlines 也不是很理想,因为有些消息有 \n 换行符,但这样的数量较少。

标签: r timezone


【解决方案1】:

首先,您可以更改 POSIXct 变量的时区。 “更改 data.frame 中的时区”没有意义,因此设置 data.frame 的"tz" 属性什么都不做。

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

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

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(...) 的工作方式因传递给它的对象的类而异。如果传递一个字符或整数,则时区根据tz=... 设置。如果传递一个已经是 POSIXct 的对象,tz=... 参数将被忽略。所以在这里我们将x 转换为整数,因此tz=... 参数得到尊重。

真的很纠结。如果有更简单的方法,我很想听听。

【讨论】:

  • 谢谢! df$posix.date
  • 我不确定发生了什么,但这些似乎通常有效,但似乎不是很准确。我将我的数据从伦敦时间转换为洛杉矶时间,然后再转换回伦敦时间,我的直方图看起来与仅使用原始数据不同。有什么想法吗?
  • 实际上,使用 Lubridate 我可以通过使用 force_tz 和 with_tz 函数来做我想做的事情
  • 是的,正是 parse_date_time 忽略了我的时区规范,并将其设置为 UCT 而不是英国时间,所以我不得不强制将英国时间作为第一步(使用 force_tz)然后切换到 LA使用 with_tz 的时间
  • 当你有一个数据表和一个日期的setkey时,它实际上改变了时区。这是超级令人沮丧和越野车!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多