Преобразовать строку в объект времени данных в r - PullRequest
2 голосов
/ 12 марта 2020

У меня есть список строк times. Я хочу преобразовать эти строки в объект datetime. Я попробовал as.POSIXct и не получил ожидаемых результатов. Я хочу, чтобы такие даты были такими 00:30, 01:30 ect ...

Есть ли какой-нибудь простой код для этого?

> times
 [1] "00:30" "01:30" "02:30" "03:30" "04:30" "05:30" "06:30" "07:30" "08:30" "09:30" "10:30" "11:30" "12:30" "13:30" "14:30"
[16] "15:30" "16:30" "17:30" "18:30" "19:30" "20:30" "21:30" "22:30" "23:30"
> times <- as.POSIXct(times, format = '%H:%M')
 [1] "2020-03-11 00:30:00 CDT" "2020-03-11 01:30:00 CDT" "2020-03-11 02:30:00 CDT" "2020-03-11 03:30:00 CDT"
 [5] "2020-03-11 04:30:00 CDT" "2020-03-11 05:30:00 CDT" "2020-03-11 06:30:00 CDT" "2020-03-11 07:30:00 CDT"
 [9] "2020-03-11 08:30:00 CDT" "2020-03-11 09:30:00 CDT" "2020-03-11 10:30:00 CDT" "2020-03-11 11:30:00 CDT"
[13] "2020-03-11 12:30:00 CDT" "2020-03-11 13:30:00 CDT" "2020-03-11 14:30:00 CDT" "2020-03-11 15:30:00 CDT"
[17] "2020-03-11 16:30:00 CDT" "2020-03-11 17:30:00 CDT" "2020-03-11 18:30:00 CDT" "2020-03-11 19:30:00 CDT"
[21] "2020-03-11 20:30:00 CDT" "2020-03-11 21:30:00 CDT" "2020-03-11 22:30:00 CDT" "2020-03-11 23:30:00 CDT"



Ответы [ 3 ]

3 голосов
/ 12 марта 2020

Как указывалось в предыдущих комментариях и ответах, класс POSIXct (т.е. время-дата) в R всегда хранит даты вместе со временем. Если вы преобразуете из символьного объекта всего несколько раз в этот класс, сегодняшняя дата добавляется по умолчанию (если вы хотите другую дату, вы можете сделать, например, следующее: as.POSIXct(paste("2020-01-01", times), format = "%Y-%m-%d %H:%M")).

Однако это почти никогда не должно быть проблемой, так как вы можете использовать format(times, format = "%H:%M") или ggplot2 scale_x_datetime, чтобы получить только время назад. Для построения графика это будет выглядеть примерно так:

times <- c("00:30", "01:30", "02:30", "03:30", "04:30", "05:30", "06:30", "07:30", "08:30", "09:30", "10:30", "11:30", "12:30", "13:30", "14:30",
           "15:30", "16:30", "17:30", "18:30", "19:30", "20:30", "21:30", "22:30", "23:30")

library(tidyverse)
df <- tibble(
  time_chr = times,
  time = as.POSIXct(times, format = "%H:%M"),
  value = rnorm(length(times))
)
df
#> # A tibble: 24 x 3
#>    time_chr time                 value
#>    <chr>    <dttm>               <dbl>
#>  1 00:30    2020-03-12 00:30:00  0.352
#>  2 01:30    2020-03-12 01:30:00 -0.547
#>  3 02:30    2020-03-12 02:30:00 -0.574
#>  4 03:30    2020-03-12 03:30:00  0.843
#>  5 04:30    2020-03-12 04:30:00  0.798
#>  6 05:30    2020-03-12 05:30:00 -0.620
#>  7 06:30    2020-03-12 06:30:00  0.213
#>  8 07:30    2020-03-12 07:30:00  1.21 
#>  9 08:30    2020-03-12 08:30:00  0.370
#> 10 09:30    2020-03-12 09:30:00  0.497
#> # … with 14 more rows

ggplot(df, aes(x = time, y = value)) +
  geom_line() +
  scale_x_datetime(date_labels = "%H:%M")

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

0 голосов
/ 12 марта 2020

В base вы можете использовать as.difftime в для преобразования строки в объект времени :

as.difftime(times, "%H:%M")
#Time differences in mins
# [1]   30   90  150  210  270  330  390  450  510  570  630  690  750  810  870
#[16]  930  990 1050 1110 1170 1230 1290 1350 1410

Вы также можете использовать пакет hms:

library(hms)
head(as_hms(paste0(times, ":00")))
#00:30:00
#01:30:00
#02:30:00
#03:30:00
#04:30:00
#05:30:00

или пакет lubridate, как уже предложено @ jpmam1

library(lubridate)
hm(times)
# [1] "30M 0S"     "1H 30M 0S"  "2H 30M 0S"  "3H 30M 0S"  "4H 30M 0S" 
# [6] "5H 30M 0S"  "6H 30M 0S"  "7H 30M 0S"  "8H 30M 0S"  "9H 30M 0S" 
#[11] "10H 30M 0S" "11H 30M 0S" "12H 30M 0S" "13H 30M 0S" "14H 30M 0S"
#[16] "15H 30M 0S" "16H 30M 0S" "17H 30M 0S" "18H 30M 0S" "19H 30M 0S"
#[21] "20H 30M 0S" "21H 30M 0S" "22H 30M 0S" "23H 30M 0S"

as.POSIXct, хранит даты с вашим временем. Если вам это нужно только для построения графика, это не вызовет проблем и используйте ответ от @ JBGruber . Следует избегать хранения дат, в которых даты отсутствуют, либо в качестве значений даты следует указывать значения, при которых очевидно, что они неверны.

head(as.POSIXct(paste("9999-1-1", times)))
#[1] "9999-01-01 00:30:00 CET" "9999-01-01 01:30:00 CET"
#[3] "9999-01-01 02:30:00 CET" "9999-01-01 03:30:00 CET"
#[5] "9999-01-01 04:30:00 CET" "9999-01-01 05:30:00 CET"
0 голосов
/ 12 марта 2020

Пакет lubridate будет делать то, что вы хотите: https://lubridate.tidyverse.org/

Если вы хотите что-то уникальное, что не является «стандартным» форматом, используйте lubridate::stamp() и примените его к ваши времена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...