【问题标题】:Combining datetime and timezone columns to get a date time object结合 datetime 和 timezone 列来获取一个日期时间对象
【发布时间】: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/strftimeas.POSIXct。您可能还想查看mapply 而不是Map,因为它提供了一个取消列出选项SIMPLIFY = TRUE
  • 您不需要在mapply 中指定SIMPLIFY = TRUE,因为它是默认值。换句话说,Map 等于 mapply(SIMPLIFY = F)
  • @DavidArenburg 确实,更新了更新 =)
  • 小心 - 时区缩写可能不明确。 “CST”有5个完全不同的含义。见this list on Wikipedia
  • 另外 - 关于您的更新 - 如果您说您已经解决了问题,那么您应该将该代码放入答案中。您确实可以回答自己的问题,只要问题/答案对可能对遇到相同问题的其他人有用,这是值得鼓励的。

标签: r datetime timezone


【解决方案1】:

如我的问题更新中所述。问题解决如下:

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)

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2011-05-05
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多