我将Excel数据导入到R中,但在转换日期时遇到问题。 在R中,我的数据是字符,看起来像:
date <-c('1971-02-00 00:00:00','1979-06-00 00:00:00')
我想将字符转换为日期(MM / YYYY),但是用于几天的'00'值引起问题,并且系统地返回'NA'。 当我手动将'00'替换为'01',然后使用as.yearmon,ymd和format时,它会起作用。但是我有很多要更改的日期,而且我不知道如何在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
如果您有想法或解决我的问题的其他想法,我将不胜感激!
答案 0 :(得分:1)
使用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"
答案 1 :(得分:0)
另一种可能是:
as.Date(paste0(substr(date1, 1, 9), "1"), format = "%Y-%m-%d")
[1] "1971-02-01" "1979-06-01"
此处提取前9个字符,并将其与1
粘贴在一起,然后将其转换为日期对象。
答案 2 :(得分:0)
这些替代方法均接受向量输入并产生向量作为输出。
这些都将接受一个向量作为输入,并产生一个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
类将直接表示此类对象,而无需使用月份的未使用日期。此类对象在内部用一年加上一年的分数表示,即Year + 0表示一月,year表示++ 1/12表示2月,依此类推。它们以有意义的方式显示,以预期的方式进行排序,可以进行操作,例如取两个这样的对象之间的差或加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"