Изменение формата даты в R
у меня есть очень простые данные в 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 ответов
здесь есть два шага:
- анализ данных. Ваш пример не полностью воспроизводим, это данные в файле или переменная в текстовой или факторной переменной? Давайте предположим последнее, тогда если Вы данные.рамка называется 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
- это характер.
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
в приведенном выше фрагменте кода есть две ошибки. Прежде всего, когда вы читаете nzd$date
внутри as.Date
вы не упоминаете, в каком формате вы его кормите date
. Таким образом, он пытается прочитать его в формате по умолчанию. Если вы видите help
док ?as.Date
вы увидите
внутри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
после чтения ваших данных через 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 ...
использование одной строки для преобразования дат в предпочтительный формат:
nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")
Это очень легко использовать lubridate пакет. Все, что вам нужно сделать, это сказать Р, в каком формате ваша дата уже. Затем он преобразует его в стандартный формат
nzd$date <- dmy(nzd$date)
вот и все.