1

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

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_timecolumn 的列,如下所示

在此处输入图像描述

4

3 回答 3

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
于 2019-09-05T08:22:22.840 回答
2

A 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
于 2019-09-05T08:28:51.330 回答
2

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

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 的尝试没有奏效的原因是因为他们在最后一次通话中缺少format参数。as.POSIXct除非明确提及,否则第二个参数默认为tzin as.POSIXct。此外,我们在这里不需要多个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"))  
于 2019-09-05T08:24:01.713 回答