【问题标题】:Converting to a standard as.Date date-time then back again, without leading zeros转换为标准 as.Date 日期时间然后再返回,没有前导零
【发布时间】:2015-10-09 20:29:13
【问题描述】:

是否可以从 R 的默认日期格式转换为用户定义的格式(此处为“m/d/yyyy”)并避免在结果日期中出现前导零? 在下面的示例中,我想让date_2 看起来像date_1。有没有办法使用format 或其他函数(理想情况下在一行代码中)来做到这一点,或者我需要求助于gsub 来查找并删除月份前面的前导零(“09”)和date_2 中的日期(“05”)?

我查看了有关 DateTimeClassesstrptimePOSIXctformat 的文档,但没有找到答案。

date_1<-"9/5/2008"
date_num<-as.Date(date_1,"%m/%d/%Y")
> date_num
[1] "2008-09-05"

date_2<-format(date_num,"%m/%d/%Y")
date_2
[1] "09/05/2008"

【问题讨论】:

    标签: r date datetime formatting


    【解决方案1】:

    我们可以使用gsub

    gsub('(?<=\\/)0|^0', '', date_2, perl=TRUE)
    #[1] "9/5/2008"
    

    或者其他版本是

    gsub('0(?=[1-9]\\/)', '', date_2, perl=TRUE)
    #[1] "9/5/2008"
    

    我们也可以转换成POSIXlt类,然后提取组件paste它。

    v1 <- as.POSIXlt(date_num)
    paste(v1$mon+1L, v1$mday, v1$year+1900, sep='/')
    #[1] "9/5/2008"
    

    【讨论】:

    • 或者没有环视业务gsub("\\b0(\\d)\\b", "\\1", date_2)
    【解决方案2】:

    这是一种使用 chron 包直接从date_num 获得所需结果的方法。

    paste(chron::month.day.year(date_num), collapse = "/")
    # [1] "9/5/2008"
    

    这也适用于多个日期。代码略有不同,因为我们需要在这里do.call()

    do.call(paste, c(chron::month.day.year(Sys.Date()-0:3), sep = "/"))
    # [1] "10/9/2015" "10/8/2015" "10/7/2015" "10/6/2015"
    

    【讨论】:

    • 漂亮!后者对我很有效,因为我希望一次转换一个 data.frame 日期列。
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 2022-01-26
    • 2011-04-24
    • 2012-11-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多