Преобразовать символ YYYY-MM-00 в дату YYYY-MM в R - PullRequest
1 голос
/ 02 июня 2019

Я импортировал данные Excel в R, и у меня возникла проблема с преобразованием дат. В R мои данные являются символами и выглядят так:

дата <-c ('1971-02-00 00:00:00', '1979-06-00 00:00:00') </p>

Я хотел бы преобразовать символ в дату (ММ / ГГГГ), но значение '00', используемое для дней, создает проблему, а 'NA' возвращаются систематически. Это работает, когда я вручную заменяю '00' на '01', а затем использую as.yearmon, ymd и format. Но у меня есть много дат, чтобы изменить, и я не знаю, как изменить все мои '00' на '01' в R.


# data exemple
date1<-c('1971-02-00 00:00:00', '1979-06-00 00:00:00')

# removing time -> doesn't work because of the '00' day
date1c<-format(strptime(date1, format = "%Y-%m-%d"), "%Y/%m/%d")
date1c<-format(strptime(date1, format = '%Y-%m'), '%Y/%m')

# trying to convert character into date -> doesn't work either
date1c<-ymd(date1)
date1c<-strptime(date1, format = "%Y-%m-%d %H:%M:%S")
date1c<-as.Date(date1, format="%Y-%m-%d %H:%M:%S")
date1c<as.yearmon(date1, format='%Y%m')

# everything works if days are '01'
date2<-c('1971-02-01 00:00:00', '1979-06-01 00:00:00')
date2c<-as.yearmon(ymd(format(strptime(date2, format = "%Y-%m-%d"), "%Y/%m/%d")))
date2c

Если у вас есть идея сделать это или другая идея, чтобы решить мою проблему, я был бы благодарен!

Ответы [ 3 ]

1 голос
/ 02 июня 2019

Используйте gsub для замены -00 на -01.

date1<-c('1971-02-01 00:00:00', '1979-06-01 00:00:00')
date1 <- gsub("-00", "-01", date1)

date1c <-format(strptime(date1, format = "%Y-%m-%d"), "%Y/%m/%d")

> date1c
[1] "1971/02/01" "1979/06/01"
0 голосов
/ 02 июня 2019

Каждая из этих альтернатив принимает входной вектор и выдает вектор в качестве выходного.

Вывод даты

Все они будут принимать вектор в качестве входного и выводят вектор Date в качестве выходного.

# 1. replace first occurrence of '00 ' with '01 ' and then convert to Date

as.Date(sub("00 ", "01 ", date1))
## [1] "1971-02-01" "1979-06-01"

# 2. convert to yearmon class and then to Date

library(zoo)
as.Date(as.yearmon(date1, "%Y-%m"))
## [1] "1971-02-01" "1979-06-01"

# 3. insert a 1 and then convert to Date

as.Date(paste(1, date1), "%d %Y-%m")
## [1] "1971-02-01" "1979-06-01"

годовой вывод

Обратите внимание, что если вы действительно пытаетесь представить только месяцы и годы, тогда класс yearmon напрямую представляет такие объекты без использования неиспользованного дня месяца,Такие объекты внутренне представлены как год плюс часть года, то есть год + 0 для января, год + 1/12 для февраля и т. Д. Они отображаются значимым образом, они сортируются ожидаемым образом и ими можно манипулировать,например, взять разницу между двумя такими объектами или добавить 1/12, чтобы получить следующий месяц, и т. д. Как и в случае с другими, он принимает вектор и производит вектор.

library(zoo)
as.yearmon(date1, "%Y-%m")
## [1] "Feb 1971" "Jun 1979"

символьный вывод

Если вы хотите получить character вместо Date или yearmon, тогда эти варианты сработают и снова примут вектор в качестве входных данных и создадут вектор в качестве выходных:

# 1. replace -00 and everything after that with a string having 0 characters

sub("-00.*", "", date1)
## [1] "1971-02" "1979-06"

# 2. convert to yearmon and then format that

library(zoo)
format(as.yearmon(date1, "%Y-%m"), "%Y-%m")
## [1] "1971-02" "1979-06"

# 3. convert to Date class and then format that

format(as.Date(paste(1, date1), "%d %Y-%m"), "%Y-%m")
## [1] "1971-02" "1979-06"

# 4. pick off the first 7 characters

substring(date1, 1, 7)
## [1] "1971-02" "1979-06"
0 голосов
/ 02 июня 2019

Другая возможность может быть:

as.Date(paste0(substr(date1, 1, 9), "1"), format = "%Y-%m-%d")

[1] "1971-02-01" "1979-06-01"

Здесь он извлекает первые девять символов, вставляет их вместе с 1, а затем преобразует в объект даты.

...