如何在R中将字符转换为日期格式?

时间:2018-02-09 16:41:11

标签: r date datetime datetime-format

如何将下面的字符转换为日期格式?

YYYY.MM

我正面临着在第10个月小数点之后处理零的问题。 说

2012.10 

在我的输入源数据中显示为

2012.1

缺少零后十进制。如何以日期格式重新提供?

3 个答案:

答案 0 :(得分:3)

由于您只有yearmonth,因此您需要在转换为日期之前为day指定一些值。在下面的示例中,日期已被任意选为15

如果输入是字符

dates = c("2012.10", "2012.01")

lubridate::ymd(paste0(year_month = dates, day = "15"))
#[1] "2012-10-15" "2012-01-15"

如果输入数字

dates = c(2012.10, 2012.01)

do.call(c, lapply(strsplit(as.character(dates), "\\."), function(d){
    if(nchar(d[2]) == 1){
        d[2] = paste0(d[2],"0")
    }
    lubridate::ymd(paste0(year = d[1], month = d[2], day = "15"))
}))
#[1] "2012-10-15" "2012-01-15"

答案 1 :(得分:2)

以下代码使用ymd()包中的lubridate函数和sprintf()来强制以数字格式提供的日期

dates <- c(2012.1, 2012.01)

以及作为字符串给出的日期

dates <- c("2012.1", "2012.01")

小数点左边的部分指定年份,而小数部分表示月份。

lubridate::ymd(sprintf("%.2f", as.numeric(dates)), truncated = 1L)
[1] "2012-10-01" "2012-01-01"

格式规范%.2f告诉sprintf()使用2位小数。

参数truncated = 1L表示缺少一个日期元素(),应该按默认值(该月的第一天)完成。或者,可以在sprintf()

的格式规范中直接指定月中的某天
lubridate::ymd(sprintf("%.2f-15", as.numeric(dates)))
[1] "2012-10-15" "2012-01-15"

答案 2 :(得分:1)

动物园包有一个"yearmon"类,用于表示没有白天的年份和月份。在内部,它将它们存储为年份+分数,其中1月的分数= 0,2月的1/12,3月的2月12日等等,但它以更好的格式打印并按预期排序。假设您的输入x是数字,将其转换为2个月的字符,然后以适当的格式应用as.yearmon

library(zoo)

x <- c(2012.1, 2012.01)  # test data

as.yearmon(sprintf("%.2f", x), "%Y.%m")
## [1] "Oct 2012" "Jan 2012"
如果需要,可以应用

as.Date"yearmon"对象转换为"Date"类,但通常不需要。

as.Date(as.yearmon(sprintf("%.2f", x), "%Y.%m"))
## [1] "2012-10-01" "2012-01-01"