Я хотел бы сохранить часть CET, CEST последовательности данных, сгенерированной ниже.
seq(as.POSIXct("2018-10-01"), as.POSIXct("2018-10-02"), "hour")
myvector <- seq(as.POSIXct("2018-10-01"), as.POSIXct("2018-10-02"), "hour")
myvector
mydf <- as.data.frame(myvector)
Что в консоли выглядит так:
> head(seq(...))
[1] "2018-10-01 00:00:00 CEST" "2018-10-01 01:00:00 CEST" "2018-10-01 02:00:00 CEST" "2018-10-01 03:00:00 CEST" "2018-10-01 04:00:00 CEST" "2018-10-01 05:00:00 CEST"
> head(myvector)
[1] "2018-10-01 00:00:00 CEST" "2018-10-01 01:00:00 CEST" "2018-10-01 02:00:00 CEST" "2018-10-01 03:00:00 CEST" "2018-10-01 04:00:00 CEST" "2018-10-01 05:00:00 CEST"
> head(mydf)
myvector
1 2018-10-01 00:00:00
2 2018-10-01 01:00:00
3 2018-10-01 02:00:00
4 2018-10-01 03:00:00
5 2018-10-01 04:00:00
6 2018-10-01 05:00:00
>
Когда я привожу его к data.frame, он теряется. Не знаю, как сохранить, пробовал такие вещи, как:
attr(mydf$myvector, "tzone") <- attr(myvector, "tzone"), но tzone на самом деле не является атрибутом, поэтому он не работает.
Что такое CEST/CET в POSIXct? Как я могу сохранить его при принудительном использовании df?
Спасибо
Упс, правда. Спасибо! Как я мог получить доступ к этой части POSIXct? (Помимо принуждения к строке и извлечению соответствующей части) Я пробовал использовать attr () и «tz» «tzone» «часовой пояс», но не смог заставить его работать. Спасибо
С attributes(mydf$myvector) я только что получил: $class [1] "POSIXct" "POSIXt" $tzone [1] "" Я хотел бы добавить новый столбец к фрейму данных или сделать его видимым в том же столбце.
Что-то вроде этого mydf$timezone <- tz(mydf$myvector)? (т.е. имея отдельный столбец для отображения часового пояса)
Привет @Prem, спасибо за ответ. Я вижу, что при использовании head(mydf$myvector) хорошие значения печатаются (например, "2018-04-01 00:00:00 CEST". Однако, когда я пытаюсь получить доступ к атрибуту tz, он пуст: attributes(mydf$myvector) дает $class [1] "POSIXct" "POSIXt" $tzone [1] "".





Вам необходимо применить as.POSIXlt к столбцу POSIXct, прежде чем извлекать из него часовой пояс.
#Extract timezone from POSIXct column of a dataframe
mydf$timezone <- attr(as.POSIXlt(mydf$myvector), "tzone")[1]
head(mydf)
# myvector timezone
#1 2018-10-01 00:00:00 Europe/Berlin
#2 2018-10-01 01:00:00 Europe/Berlin
#3 2018-10-01 02:00:00 Europe/Berlin
#4 2018-10-01 03:00:00 Europe/Berlin
#5 2018-10-01 04:00:00 Europe/Berlin
#6 2018-10-01 05:00:00 Europe/Berlin
Пример данных:
myvector <- seq(as.POSIXct("2018-10-01"), as.POSIXct("2018-10-02"), "hour")
head(myvector)
#[1] "2018-10-01 00:00:00 CEST" "2018-10-01 01:00:00 CEST" "2018-10-01 02:00:00 CEST"
#[4] "2018-10-01 03:00:00 CEST" "2018-10-01 04:00:00 CEST" "2018-10-01 05:00:00 CEST"
mydf <- as.data.frame(myvector)
head(mydf$myvector)
#[1] "2018-10-01 00:00:00 CEST" "2018-10-01 01:00:00 CEST" "2018-10-01 02:00:00 CEST"
#[4] "2018-10-01 03:00:00 CEST" "2018-10-01 04:00:00 CEST" "2018-10-01 05:00:00 CEST"
Альтернативный подход: Если вас действительно волнует только вывод CET или CEST
mydf$timezone <- gsub("^.*\\s", "", format(mydf$myvector, usetz = TRUE))
head(mydf)
# myvector timezone
#1 2018-10-01 00:00:00 CEST
#2 2018-10-01 01:00:00 CEST
#3 2018-10-01 02:00:00 CEST
#4 2018-10-01 03:00:00 CEST
#5 2018-10-01 04:00:00 CEST
#6 2018-10-01 05:00:00 CEST
Привет, Прем, еще раз спасибо. Ваше решение работает, если в период, выбранный для последовательности, нет изменения летнего времени. В Европе 25 марта 2018 года произошло изменение времени, и цона сместились с CET (Центральноевропейское время) на (Центральное летнее европейское время). Есть идеи, как решить эту проблему? myvector <- seq(as.POSIXct("2018-03-25"), as.POSIXct("2018-03-26"), "hour") head(myvector) mydf <- as.data.frame(myvector) head(mydf$myvector) mydf$timezone <- attr(as.POSIXlt(mydf$myvector), "tzone") head(mydf)
Вы хотите только CET или CEST? Как насчет Europe/Berlin? В противном случае единственная возможность - использовать подстроку даты символа (см. Обновленный ответ).
Да, я хотел бы иметь столбец CET / CEST в наборе данных. Ваше решение, кажется, работает идеально. Не могли бы вы объяснить выражение ^.*\\s? Означает ли это "Все до второго пробела (включено)"?
Рад, что помог! ^.*\\s означает все (.*) от начала (^) до последнего появления пробела (\\s) (для получения дополнительной информации см. это).
Не потеряно -
head(mydf$myvector)