【问题标题】:R apply() function format() over POSIXctR apply() function format() over POSIXct
【发布时间】:2018-04-12 09:55:42
【问题描述】:

我有一个包含两列的data.frame

  • UTCTime 是 UTC 区域中的事件时间
  • TimeZone 这是事件发生的实际时区

我的数据样本:

UTCTime <- as.POSIXct(c("2018-04-12 17:23:14", "2018-04-12 17:17:14","2018-04-12 07:48:20", "2018-04-12 11:25:04", "2018-04-12 11:24:38"), tz = "UTC")
TimeZone <- c("Europe/Prague", "Europe/Dublin", "Europe/Prague", "Europe/Prague", "Europe/Prague")
df <- cbind.data.frame(UTCTime, TimeZone, stringsAsFactors = FALSE)

df
              UTCTime      TimeZone
1 2018-04-12 17:23:14 Europe/Prague
2 2018-04-12 17:17:14 Europe/Dublin
3 2018-04-12 07:48:20 Europe/Prague
4 2018-04-12 11:25:04 Europe/Prague
5 2018-04-12 11:24:38 Europe/Prague

我想获取本地时区的时间向量。我成功地为单行做到了:

> format(df$UTCTime[1], "%Y-%m-%d %H:%M:%S", tz = df$TimeZone[1])
[1] "2018-04-12 19:23:14"

但是,当我尝试将其应用于整个 data.frame 时,我收到了一个错误:

> apply(df, 1, function(x) format(x["UTCTime"], "%Y-%m-%d %H:%M:%S", tz = x["TimeZone"]))

 Error in format.default(x["UTCTime"], "%Y-%m-%d %H:%M:%S", tz = x["TimeZone"]) : 
  invalid 'trim' argument 

当我尝试将任何其他函数传递给 apply 时,一切正常:

> apply(df, 1, function(x) paste(x["UTCTime"], x["TimeZone"]))
[1] "2018-04-12 17:23:14 Europe/Prague" "2018-04-12 17:17:14 Europe/Dublin" "2018-04-12 07:48:20 Europe/Prague"
[4] "2018-04-12 11:25:04 Europe/Prague" "2018-04-12 11:24:38 Europe/Prague"
  • 为什么我在这里收到invalid 'trim' argument
  • 如何获得当地时间的向量?

【问题讨论】:

  • 您不能在此处使用apply,因为它会将 data.frame 强制转换为矩阵,并且矩阵只能保存 (i) 一种数据类型,并且 (ii) 不能保存 POSIXct 变量。

标签: r apply posixct


【解决方案1】:

唯一的问题是允许时区变化。解决方案:

mapply(df$UTCTime, tz = df$TimeZone, FUN = format)
## [1] "2018-04-12 19:23:14" "2018-04-12 18:17:14" "2018-04-12 09:48:20"
## [4] "2018-04-12 13:25:04" "2018-04-12 13:24:38"

【讨论】:

    【解决方案2】:

    你可以使用tidyverse:

    df %>% 
      rowwise %>%
      transmute(LocalTime = format(UTCTime, tz = TimeZone))
    
    
    # A tibble: 5 x 1
      LocalTime          
      <chr>              
    1 2018-04-12 19:23:14
    2 2018-04-12 18:17:14
    3 2018-04-12 09:48:20
    4 2018-04-12 13:25:04
    5 2018-04-12 06:24:38
    

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多