代码之家  ›  专栏  ›  技术社区  ›  Naive_Natural2511

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

  •  0
  • Naive_Natural2511  · 技术社区  · 7 年前

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

    YYYY.MM
    

    我面临着一个关于第10个月小数点后零的问题。 说

    2012.10 
    

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

    2012.1
    

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

    3 回复  |  直到 7 年前
        1
  •  3
  •   d.b    7 年前

    因为你只有 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"
    
        2
  •  3
  •   G. Grothendieck    7 年前

    动物园套餐有 "yearmon" 用于表示无日期的年和月的类。在内部,它将它们存储为年+分数,其中分数=0表示1月,1/12表示2月,2/12表示3月,等等,但它以更好的格式打印,并按预期进行排序。假设您的输入, 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 可用于转换 “元旦” 反对 "Date" 如果需要,但通常不需要。

    as.Date(as.yearmon(sprintf("%.2f", x), "%Y.%m"))
    ## [1] "2012-10-01" "2012-01-01"
    
        3
  •  2
  •   Uwe    7 年前

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