Изменение формата даты в R - PullRequest
       19

Изменение формата даты в R

19 голосов
/ 16 сентября 2011

У меня есть несколько очень простых данных в R, для которых необходимо изменить формат даты:

 date midpoint
1   31/08/2011   0.8378
2   31/07/2011   0.8457
3   30/06/2011   0.8147
4   31/05/2011   0.7970
5   30/04/2011   0.7877
6   31/03/2011   0.7411
7   28/02/2011   0.7624
8   31/01/2011   0.7665
9   31/12/2010   0.7500
10  30/11/2010   0.7734
11  31/10/2010   0.7511
12  30/09/2010   0.7263
13  31/08/2010   0.7158
14  31/07/2010   0.7110
15  30/06/2010   0.6921
16  31/05/2010   0.7005
17  30/04/2010   0.7113
18  31/03/2010   0.7027
19  28/02/2010   0.6973
20  31/01/2010   0.7260
21  31/12/2009   0.7154
22  30/11/2009   0.7287
23  31/10/2009   0.7375

Вместо %d/%m/%Y мне бы хотелось, чтобы в стандартном формате R %Y-%m-%d

Как я могу сделать это изменение? Я пробовал:

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

Но это просто отрезало год и добавило нули к дню:

 [1] "0031/08/20" "0031/07/20" "0030/06/20" "0031/05/20" "0030/04/20"
 [6] "0031/03/20" "0028/02/20" "0031/01/20" "0031/12/20" "0030/11/20"
 [11] "0031/10/20" "0030/09/20" "0031/08/20" "0031/07/20" "0030/06/20"
 [16] "0031/05/20" "0030/04/20" "0031/03/20" "0028/02/20" "0031/01/20"
 [21] "0031/12/20" "0030/11/20" "0031/10/20" "0030/09/20" "0031/08/20"
 [26] "0031/07/20" "0030/06/20" "0031/05/20" "0030/04/20" "0031/03/20"
 [31] "0028/02/20" "0031/01/20" "0031/12/20" "0030/11/20" "0031/10/20"
 [36] "0030/09/20" "0031/08/20" "0031/07/20" "0030/06/20" "0031/05/20"

Спасибо!

Ответы [ 7 ]

42 голосов
/ 16 сентября 2011

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

  • Разобрать данные.Ваш пример не полностью воспроизводим, это данные в файле или переменная в текстовой или факторной переменной?Предположим, что последнее, то если ваш 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 является символом.

7 голосов
/ 08 августа 2016
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")

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

формат
Строка символов.Если он не указан, он попытается использовать «% 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 голосов
/ 07 февраля 2014

Вы также можете использовать функцию 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 очень гибким.

3 голосов
/ 16 сентября 2011

После чтения ваших данных через 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 ...
1 голос
/ 30 августа 2018

Использование одной строки для преобразования даты в предпочтительный формат:

nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")
1 голос
/ 05 июля 2018

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

nzd$date <- dmy(nzd$date)

и все.

0 голосов
/ 16 сентября 2011

Я считаю, что

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

достаточно.

...