【问题标题】:Unable to extract time alone despite date and datetime being successful尽管日期和日期时间成功,但无法单独提取时间
【发布时间】:2020-01-08 02:30:25
【问题描述】:

我有一个如下所示的数据框

startdate <-c('10/29/2318 11:43','10/29/2311 11:43','11/19/2108 11:43')

employ <- data.frame(startdate)

我正在尝试提取 date,datetime and time 组件。尽管使用date and datetime 成功,但由于某种原因,相同的操作对time 提取效果不佳。

请在下面找到我的代码

transform_dates = function(DF){
    DF %>% 
       mutate(measurement_date = as.Date(startdate,format = "%m/%d/%Y %H:%M")) %>%
       mutate(measurement_datetime = format(as.POSIXct(startdate,format="%m/%d/%Y %H:%M"),"%Y-%m-%d %T")) %>%
       mutate(measurement_time = format(as.POSIXct(startdate,"%m/%d/%Y %H:%M"),"%H:%M"))  # also tried with `%T`
 }
        # the code throws error in `measurement_time` line

transform_dates(employ)

我成功获得了两列的以下输出

您能帮我理解为什么相同的format 方法不适用于measurement_time 列吗?相反,我得到了这个错误

as.POSIXlt.character(as.character(x), ...) 中的错误: 字符串不是标准的明确格式

但我希望我的输出还有另一个名为 measurement_time 的列,如下所示

【问题讨论】:

    标签: r dataframe datetime formatting dplyr


    【解决方案1】:

    将其转换为日期时间,然后使用as.Dateformat 分别获取日期和时间

    library(dplyr)
    
    transform_dates = function(DF){
      DF %>% 
        mutate(measurement_datetime = as.POSIXct(startdate, format = "%m/%d/%Y %H:%M"), 
               measurement_date = as.Date(measurement_datetime), 
               measurement_time = format(measurement_datetime, "%T"))
    }
    
    transform_dates(employ)
    
    #         startdate measurement_datetime measurement_date measurement_time
    #1 10/29/2318 11:43  2318-10-29 11:43:00       2318-10-29         11:43:00
    #2 10/29/2311 11:43  2311-10-29 11:43:00       2311-10-29         11:43:00
    #3 11/19/2108 11:43  2108-11-19 11:43:00       2108-11-19         11:43:00
    

    OP 的尝试失败的原因是因为他们在最后一次调用中缺少 as.POSIXct 中的 format 参数。除非明确提及,否则第二个参数默认为as.POSIXct 中的tz。此外,我们在这里不需要多个 mutate 声明。因此,整合上述更改,以下工作。

    employ %>% 
      mutate(measurement_date = as.Date(startdate,format = "%m/%d/%Y %H:%M"), 
             measurement_datetime = format(as.POSIXct(startdate,format="%m/%d/%Y %H:%M"),"%Y-%m-%d %T"),
             measurement_time = format(as.POSIXct(startdate,format = "%m/%d/%Y %H:%M"),"%H:%M"))  
    

    【讨论】:

    • 太棒了。赞成。但是你介意让我知道我对measurement_time 的陈述有什么问题吗?
    • @SSMK 您在as.POSIXct 中缺少format 参数。 mutate(measurement_time = format(as.POSIXct(startdate,format = "%m/%d/%Y %H:%M"),"%H:%M")) 会起作用的。
    • 谢谢。时间限制结束后将标记答案。使用 %>%` 的多个变异与括号中的单个变异相同吗?试图了解你和我的代码之间的区别
    • @SSMK 是的,在这种情况下是一样的。所以一个单一的mutate 电话就足够了。
    • 我不知道任何与之相关的资源,但是当使用链 (&gt;%&gt;) 时,您不需要使用 $ 来提取列。
    【解决方案2】:

    lubridate-dplyr-tidyr(tidyverse) 方法:

    employ %>% 
       mutate(startdate=lubridate::mdy_hm(startdate)) %>% 
       tidyr::separate(startdate, into= c("Date", "Time"), sep = " ")
            Date     Time
    1 2318-10-29 11:43:00
    2 2311-10-29 11:43:00
    3 2108-11-19 11:43:00
    

    【讨论】:

      【解决方案3】:

      获取测量值的一种非常简单的方法是删除字符串上的所有内容

      employ%>%mutate(measurement_time = sub(".* (.*)","\\1",startdate))
               startdate measurement_time
      1 10/29/2318 11:43            11:43
      2 10/29/2311 11:43            11:43
      3 11/19/2108 11:43            11:43
      

      【讨论】:

      • 嘿,谢谢。赞成。但是你能告诉我我的格式声明有什么问题吗?
      • @Ronak Shah 为您解答
      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多