将字符 YYYY-MM-00 转换为 R 中的日期 YYYY-MM

Convert character YYYY-MM-00 into date YYYY-MM in R

我将 Excel 数据导入 R,但在转换日期时遇到问题。 在 R 中,我的数据是字符,看起来像:

日期<-c('1971-02-00 00:00:00', '1979-06-00 00:00:00')

我想将字符转换为日期 (MM/YYYY),但是天数中使用的 '00' 值会造成问题,系统会返回 'NA'。 当我手动将“00”替换为“01”然后使用 as.yearmon、ymd 和格式时,它会起作用。但是我有很多日期要更改,我不知道如何在 R 中将我所有的“00”更改为“01”。


# 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

如果您有想法或其他想法来解决我的问题,我将不胜感激!

使用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"

另一种可能是:

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

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

此处提取前九个字符,与1粘贴在一起,然后将其转换为日期对象。

这些备选方案每个都接受一个向量输入并产生一个向量作为输出。

日期输出

这些都将接受一个向量作为输入并产生一个 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 输出

请注意,如果您真的只想表示月份和年份,那么 yearmon class 直接表示此类对象,而无需使用每月未使用的日期。这些对象在内部表示为一年加上一年的分数,即 year + 0 表示一月,year + 1/12 表示二月等。它们以有意义的方式显示,它们以预期的方式排序并且可以被操作,例如取两个这样的对象之间的差异或加上 1/12 以获得下个月,等等。与其他对象一样,它接受一个向量并产生一个向量。

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

字符输出

如果您想要 character 输出而不是 Dateyearmon 输出,那么这些变体起作用并再次接受一个向量作为输入并产生一个向量作为输出:

# 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"