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

How to convert character to Date format in R?

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

YYYY.MM

我遇到了处理第 10 个月小数点后零的问题。 说

2012.10 

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

2012.1

缺少零 post 小数。如何将其恢复为日期格式?

由于您只有 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"

zoo 包有一个 "yearmon" class 用于表示没有日期的年月。在内部它将它们存储为年 + 分数,其中分数 = 0 表示一月,1/12 表示二月,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" class,但通常没有必要。

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

下面的代码使用 lubridate 包中的 ymd() 函数和 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表示缺少一个日期元素(day),应按默认值(每月的第一天)补全。或者,可以在格式规范中直接将月中的日期指定为 sprintf():

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