Изменение формата даты с помощью R [duplicate]

Используя ваш пример dataframe, мы могли бы:

xtabs(value ~ name + numbers, data = dat1)
11
задан A.Krueger 16 September 2011 в 04:56
поделиться

7 ответов

Здесь есть два шага:

  • Разбор данных. Ваш пример не полностью воспроизводимый, это данные в файле или переменная в текстовой или факторной переменной? Предположим, что последний, тогда, если вы data.frame называетесь X, вы можете сделать
 X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")

Теперь столбец newdate должен иметь тип Date.

  • Отформатируйте данные. Это вопрос вызова format() или strftime():
 format(X$newdate, "%Y-%m-%d")

Более полный пример:

R> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), 
+                    mid=c(0.8378,0.8457,0.8147))
R> nzd
        date    mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
R> nzd$newdate <- strptime(as.character(nzd$date), "%d/%m/%Y")
R> nzd$txtdate <- format(nzd$newdate, "%Y-%m-%d")
R> nzd
        date    mid    newdate    txtdate
1 31/08/2011 0.8378 2011-08-31 2011-08-31
2 31/07/2011 0.8457 2011-07-31 2011-07-31
3 30/06/2011 0.8147 2011-06-30 2011-06-30
R> 

Разница между столбцами три и четыре - это тип: newdate имеет класс Date, тогда как txtdate является символом.

31
ответ дан Dirk Eddelbuettel 22 August 2018 в 10:37
поделиться
  • 1
    хм, это кажется чрезвычайно сложным для нооба. Я закончил тем, что просто изменил форматирование в excel и прочитал файл csv обратно в R. Я хотел знать, как легко изменить его в R, если у меня был гораздо больший файл, но это выглядит не так просто, как это должно быть. Это мало что касается вашего решения, я просто надеялся, что это будет намного проще (возможно, способ конвертировать исходный столбец без создания нового). Есть ли способ сначала изменить класс, а затем отформатировать его? – A.Krueger 16 September 2011 в 05:45
  • 2
    @Yuri - По сути, ответ Дирка показывал вам, как это сделать, хотя он создал несколько новых столбцов на этом пути, чтобы вы могли легко увидеть, что происходит «под капотом». Я рекомендую пройтись по его примеру по строкам, вставив str(x) между каждой строкой, чтобы вы могли видеть различия в действии. – Chase 16 September 2011 в 12:53
  • 3
    @Chase Спасибо, я ценю дополнительную колонку для педагогических целей, и это помогло мне увидеть разницу в классе, а также формат; так спасибо за это! Полезно знать, что дополнительный шаг с дополнительной колонкой не является строго необходимым. Спасибо вам обоим! – A.Krueger 17 September 2011 в 06:50

Вы также можете использовать функцию parse_date_time из пакета lubridate:

library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"

parse_date_time возвращает объект POSIXct, поэтому мы используем as.Date для получения объекта даты. Первый аргумент parse_date_time указывает вектор даты, второй аргумент определяет порядок, в котором происходит ваш формат. Аргумент orders делает parse_date_time очень гибким.

4
ответ дан Ben Rollert 22 August 2018 в 10:37
поделиться

После чтения ваших данных через textConnection, похоже, работает следующее:

dat <- read.table(textConnection(txt), header = TRUE)
dat$date <- strptime(dat$date, format= "%d/%m/%Y")
format(dat$date, format="%Y-%m-%d")

> format(dat$date, format="%Y-%m-%d")
 [1] "2011-08-31" "2011-07-31" "2011-06-30" "2011-05-31" "2011-04-30" "2011-03-31"
 [7] "2011-02-28" "2011-01-31" "2010-12-31" "2010-11-30" "2010-10-31" "2010-09-30"
[13] "2010-08-31" "2010-07-31" "2010-06-30" "2010-05-31" "2010-04-30" "2010-03-31"
[19] "2010-02-28" "2010-01-31" "2009-12-31" "2009-11-30" "2009-10-31"

> str(dat)
'data.frame':   23 obs. of  2 variables:
 $ date    : POSIXlt, format: "2011-08-31" "2011-07-31" "2011-06-30" ...
 $ midpoint: num  0.838 0.846 0.815 0.797 0.788 ...
3
ответ дан Chase 22 August 2018 в 10:37
поделиться
  • 1
    Это сначала меняет тип, а затем форматирует его? – A.Krueger 16 September 2011 в 05:50
  • 2
    @Yuri - правильно. – Chase 16 September 2011 в 12:51
  • 3
    У меня есть вопрос о POSIXlt в кадрах данных, как указано здесь: stackoverflow.com/questions/3355107/… Когда я пытаюсь построить дату в качестве оси x в ggplot, я получаю эту ошибку - Ошибка в if (length (range) == 1 || diff (range) == 0) {: отсутствует значение, где требуется TRUE / FALSE - Как я могу получить это в POSIXct? – A.Krueger 17 September 2011 в 09:27
  • 4
    @Yuri - что-то вроде as.POSIXct(otherStuffHere), вероятно, сработает. Спасибо за эту ссылку, я не знал о тех проблемах, которые поднимал Хэдли. – Chase 17 September 2011 в 13:48
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")

В приведенном выше фрагменте кода есть две ошибки. Прежде всего, когда вы читаете nzd$date внутри as.Date, вы не указываете, в каком формате вы его подаете date. Таким образом, он пытается установить формат по умолчанию для его чтения. Если вы видите документ help, ?as.Date, вы увидите

format. Символьная строка. Если не указано, он попытается «% Y-% m-% d», а затем «% Y /% m /% d» на первом элементе, отличном от NA, и сообщите об ошибке, если они не работают. В противном случае обработка выполняется через strptime

. Вторая ошибка: даже если вы хотели бы прочитать ее в формате %Y-%m-%d, внутри format вы написали "%Y/%m/%d".

Теперь правильный способ сделать это:

> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), 
+                                       mid=c(0.8378,0.8457,0.8147))
> nzd
        date    mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
> nzd$date <- format(as.Date(nzd$date, format = "%d/%m/%Y"), "%Y-%m-%d")
> head(nzd)
        date    mid
1 2011-08-31 0.8378
2 2011-07-31 0.8457
3 2011-06-30 0.8147
5
ответ дан hi15 22 August 2018 в 10:37
поделиться

Я считаю, что

nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")

является достаточным.

0
ответ дан joran 22 August 2018 в 10:37
поделиться
  • 1
    Согласен, но он полагается на magic (форматирование по умолчанию), поэтому полезно показать различные шаги. – Dirk Eddelbuettel 16 September 2011 в 13:55
  • 2
    @Dirk Действительно, именно поэтому я проголосовал за ваш ответ! ;) – joran 16 September 2011 в 15:26

Это очень просто, используя пакет lubridate. Все, что вам нужно сделать, это указать R, в каком формате уже установлена ​​дата. Затем он преобразует его в стандартный формат

nzd$date <- dmy(nzd$date)

, вот и все.

0
ответ дан user2678319 22 August 2018 в 10:37
поделиться
1
ответ дан user 5 November 2018 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: