将R

时间:2019-06-02 13:44:49

标签: r excel character date-conversion

我将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

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

3 个答案:

答案 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输出

请注意,如果您实际上只是想表示月份和年份,那么yearmon类将直接表示此类对象,而无需使用月份的未使用日期。此类对象在内部用一年加上一年的分数表示,即Year + 0表示一月,year表示++ 1/12表示2月,依此类推。它们以有意义的方式显示,以预期的方式进行排序,可以进行操作,例如取两个这样的对象之间的差或加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"