如何将下面的字符转换为日期格式?
YYYY.MM
我正面临着在第10个月小数点之后处理零的问题。 说
2012.10
在我的输入源数据中显示为
2012.1
缺少零后十进制。如何以日期格式重新提供?
答案 0 :(得分:3)
由于您只有year
和month
,因此您需要在转换为日期之前为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"