Преобразование времени в формат символов «HMS» в R - PullRequest
0 голосов
/ 10 октября 2018

У меня есть столбец даты и времени, отформатированный как '2000-11-21 10:01:01', 2000-11-21 00:02:01 ', 2000-11-21 00:00:06.Я хотел бы создать новый столбец, который установил бы время в формате HMS, например, в 3 приведенных выше датах он будет возвращать «HMS», «MS», «S».Я попытался бы сделать это следующим образом, но мне было интересно, есть ли более простой способ сделать это:

ifelse(
  grepl("00:00:", datecolumn), "S", 
        ifelse(grepl("00:", datecolumn), "MS", "HMS")
)

Вывод:

 datecolumn                 HMS
2000-11-21 10:01:01         HMS
2000-11-21 00:02:01          MS
2000-11-21 00:00:06           S
2000-11-21 00:00:10           S
2000-11-21 00:10:06          MS
2000-11-21 00:00:07           S
2000-11-21 10:00:06         HMS

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Функция case_when() из dplyr может обеспечить удобочитаемую альтернативу вложенным ifelse блокам.stringi на самом деле не нужен (grepl будет работать нормально), но мне нравится выразительная природа stringi имен функций (а stringr - ненужный костыль IMO):

library(stringi)
library(tidyverse)

read.csv(text="datecolumn,HMS
2000-11-21 10:01:01,HMS
2000-11-21 00:02:01,MS
2000-11-21 00:00:06,S
2000-11-21 00:00:10,S
2000-11-21 00:10:06,MS
2000-11-21 00:00:07,S
2000-11-21 10:00:06,HMS", stringsAsFactors=FALSE) -> xdf

Обратите внимание, чтопорядок здесь имеет значение:

mutate(xdf, computed_hms = case_when(
  stri_detect_regex(datecolumn, "00:00:[[:digit:]]{2}") ~ "S",
  stri_detect_regex(datecolumn, "00:[[:digit:]]{2}:[[:digit:]]{2}") ~ "MS",
  stri_detect_regex(datecolumn, "[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}") ~ "HMS"
  TRUE ~ NA_character_
))
##            datecolumn HMS computed_hms
## 1 2000-11-21 10:01:01 HMS          HMS
## 2 2000-11-21 00:02:01  MS           MS
## 3 2000-11-21 00:00:06   S            S
## 4 2000-11-21 00:00:10   S            S
## 5 2000-11-21 00:10:06  MS           MS
## 6 2000-11-21 00:00:07   S            S
## 7 2000-11-21 10:00:06 HMS          HMS
0 голосов
/ 11 октября 2018

Преобразовать часть времени в data.table::ITime («класс времени дня, хранимый как целое число секунд в дне»), и cut его с соответствующими breaks и labels:

d$HMS <- cut(data.table::as.ITime(d$datecolumn),
             breaks = c(0, 60 - 1, 60 * 60 - 1, Inf),
             labels = c("s", "ms", "hms"))
d
#                     datecolumn HMS
# 1          2000-11-21 10:01:01 hms
# 2          2000-11-21 00:02:01  ms
# 3          2000-11-21 00:00:06   s
# 4          2000-11-21 00:00:10   s
# 5          2000-11-21 00:10:06  ms
# 6          2000-11-21 00:00:07   s
# 7          2000-11-21 10:00:06 hms
0 голосов
/ 10 октября 2018

Вы можете использовать пакет lubridate вместе с paste следующим образом:

require(lubridate)
df$new_col <- paste(ifelse(hour(df$date) > 0, "H", ""), 
                    ifelse(minute(df$date) > 0, "M", ""), 
                    ifelse(second(df$date) > 0, "S", ""), sep = "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...