【发布时间】:2014-08-21 09:36:35
【问题描述】:
我的数据集中有两列:DATE_TIME 和 TZ,它们都是字符串。我想将这两者结合起来得到一个合适的数据对象。
> df
DATE_TIME TIME_ZONE
1 4/18/1950 0130 CST
2 4/18/1950 0145 CST
3 2/20/1951 1600 CST
4 6/8/1951 0900 CST
5 11/15/1951 1500 CST
6 11/15/1951 2000 CST
这是我尝试过的,但没有给我预期的结果:
convertToDateTime <- function(dtString, tz) {
strptime(dtString, tz = tz, "%m/%d/%Y %H%M")
}
df$DATETIME <- Map(convertToDateTime, df$DATE_TIME, df$TIME_ZONE)
class(df$DATETIME) # -> list
显然,此映射将 convertToDateTime 的结果转换为列表。我应该使用不同的功能吗?
更新:好吧,那是在炫耀,我缺乏 R 技能 :(。根据 LukeA 的如下评论修复了它:
convertToDateTime <- function(dtString, tz) {
strftime(strptime(dtString, tz=tz, format="%m/%d/%Y %H%M"), tz=tz)
}
df$DATETIME <- mapply(convertToDateTime, df$DATE_TIME, df$TIME_ZONE)
【问题讨论】:
-
好吧,
?strptime"将字符表示转换为“POSIXlt”类的对象,它是一个列表对象。根据您的需要,您可以使用format/strftime或as.POSIXct。您可能还想查看mapply而不是Map,因为它提供了一个取消列出选项SIMPLIFY = TRUE。 -
您不需要在
mapply中指定SIMPLIFY = TRUE,因为它是默认值。换句话说,Map等于mapply(SIMPLIFY = F) -
@DavidArenburg 确实,更新了更新 =)
-
小心 - 时区缩写可能不明确。 “CST”有5个完全不同的含义。见this list on Wikipedia。
-
另外 - 关于您的更新 - 如果您说您已经解决了问题,那么您应该将该代码放入答案中。您确实可以回答自己的问题,只要问题/答案对可能对遇到相同问题的其他人有用,这是值得鼓励的。