【问题标题】:How to convert character to Date format in R?如何在R中将字符转换为日期格式?
【发布时间】:2018-02-09 16:41:11
【问题描述】:

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

YYYY.MM

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

2012.10 

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

2012.1

缺少小数点后零。如何以日期格式恢复它?

【问题讨论】:

  • 尝试运行 options(digits=2) 还是只有一位小数吗?
  • 您需要一个 year 和一个 month 以及一个 day 来表示日期。否则有一个yearmon 类型。
  • 如果 2012.1 去掉尾随零,你怎么知道它是指第 1 个月还是第 10 个月?
  • @G.Grothendieck 2012.01 与 1 月相关,2012.1 与 10 月相关

标签: r date datetime datetime-format


【解决方案1】:

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

【讨论】:

  • 如果输入的是数字,可以简化为lubridate::ymd(sprintf("%.2f-15", dates))
【解决方案2】:

zoo 包有一个"yearmon" 类,用于表示没有日的年月。在内部,它将它们存储为年 + 分数,其中分数 = 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" 类,但通常这不是必需的。

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

【讨论】:

    【解决方案3】:

    下面的代码使用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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多