Преобразовать (отформатировать) время часов из Ч: ММ в ЧЧ: ММ - PullRequest
1 голос
/ 24 февраля 2020

Столбец времени состоит из H:MM и HH:MM следующим образом:

TIME
4:08
6:12
8:15
10:15
14:16
16:55

Я хочу отформатировать все часы в формате HH:MM следующим образом (т.е. добавить ноль, когда время H:MM)

TIME
04:08
06:12
08:15
10:15
14:16
16:55

Ответы [ 5 ]

3 голосов
/ 24 февраля 2020

Используйте strptime (или as.POSIXct) для чтения объекта даты и времени и используйте format (или strftime) для извлечения части времени.

format(strptime(df$TIME, "%H:%M"), "%H:%M")

# [1] "04:08" "06:12" "08:15" "10:15" "14:16" "16:55"
2 голосов
/ 24 февраля 2020
Input = ('TIME
4:08
6:12
8:15
10:15
14:16
16:55')

df = read.table(textConnection(Input), header = T, stringsAsFactors = F)
df$TIME <- ifelse(nchar(df$TIME)==4, paste0("0", df$TIME), df$TIME)
df
   TIME
1 04:08
2 06:12
3 08:15
4 10:15
5 14:16
6 16:55
1 голос
/ 24 февраля 2020

Поскольку вы сказали, что у вас есть столбец со временем, я предполагаю, что у вас есть фрейм данных. В этом случае я помещаю ваши данные в фрейм данных и обрабатываю их с помощью , преобразуя нужные вам времена в два новых столбца: один - character, а другой - time, так как вы не указали формат вы хотели получить результат. И краткое объяснение: %R эквивалентно %H:%M.

library(tidyverse)
library(hms)

data.frame(ID = c(1L, 2L, 3L, 4L, 5L, 6L),
           TIME = c("4:08", "6:12", "8:15", "10:15", "14:16", "16:55"),
           stringsAsFactors = F) %>% 
  as_tibble(.) %>% 
  mutate(TIME2 = format(strptime(TIME, "%R"), "%R"),
         TIME3 = as_hms(as.POSIXct(TIME, format = "%R")))

#> # A tibble: 6 x 4
#>      ID TIME  TIME2 TIME3 
#>   <int> <chr> <chr> <time>
#> 1     1 4:08  04:08 04:08 
#> 2     2 6:12  06:12 06:12 
#> 3     3 8:15  08:15 08:15 
#> 4     4 10:15 10:15 10:15 
#> 5     5 14:16 14:16 14:16 
#> 6     6 16:55 16:55 16:55

Создано в 2020-02-24 пакетом Представить (v0.3.0)

1 голос
/ 24 февраля 2020

Одна базовая опция R должна использовать regmatches + sprintf, т. Е.

d <- `class<-`(do.call(rbind,with(df,regmatches(TIME,gregexpr("\\d+",TIME)))),"numeric")
df$TIME_new <- sprintf("%02i:%02i",d[,1],d[,2])

, такой что

> df
   TIME TIME_new
1  4:08    04:08
2  6:12    06:12
3  8:15    08:15
4 10:15    10:15
5 14:16    14:16
6 16:55    16:55
1 голос
/ 24 февраля 2020

Рассматривая их как строки, можно использовать paste0, т.е.

d1$TIME[nchar(sub(':.*', '', d1$TIME)) == 1] <- paste0('0', d1$TIME[nchar(sub(':.*', '', d1$TIME)) == 1])

, что дает

   TIME
1 04:08
2 06:12
3 08:15
4 10:15
5 14:16
6 16:55

ДАННЫЕ

dput(d1)
structure(list(TIME = structure(c(4L, 5L, 6L, 1L, 2L, 3L), .Label = c("10:15", 
"14:16", "16:55", "4:08", "6:12", "8:15"), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))
...