【问题标题】:How to subtract/add days from/to a date?如何从/到日期减去/添加天数?
【发布时间】:2011-01-16 08:00:36
【问题描述】:

我正在尝试构建文件夹来存储数据拉取。我想用拉取数据的日期标记文件夹。

例如。我从 mysql 中提取 5 天前的数据,我想将文件夹命名为 5 天前的日期。

MySQL 可以轻松处理日期运算。我不确定 R 到底是如何做到的。我是否应该在 POSIXct 中减去适当的秒数,然后转换为 POSIXlt 以命名文件夹 MM_DD_YYYY?

或者有没有更好的方法?

【问题讨论】:

    标签: r date r-faq


    【解决方案1】:

    只需减去一个数字:

    > as.Date("2009-10-01")
    [1] "2009-10-01"
    > as.Date("2009-10-01")-5
    [1] "2009-09-26"
    

    由于Date 类只有几天,你可以对它进行基本的算术运算。

    如果你出于某种原因想使用 POSIXlt,那么你可以使用它的插槽:

    > a <- as.POSIXlt("2009-10-04")
    > names(unclass(as.POSIXlt("2009-10-04")))
    [1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
    > a$mday <- a$mday - 6
    > a
    [1] "2009-09-28 EDT"
    

    【讨论】:

    • 或者使用 POSIXct 并减去一天的秒数。 trunc()round() 也可用于修剪 POSIXt 对象。
    • 好吧,这看起来是迄今为止最好的。只是为了确保它正确处理不同的月日金额和闰年?
    • 是的,它正确地完成了所有这些事情。您可以通过将日期设置为 DST 前后(例如)来自己进行快速测试,以确认这一点,因为每种方法可能有不同的行为。
    • 此外,R 文档指出 $yday 仅供参考,不能用于增加日期。
    • 并根据您的需要使用formatas.Date,例如as.Date('15/02/2015', format('%d/%m/%Y'))+ 21
    【解决方案2】:

    答案可能取决于您的日期格式,但这里有一个使用 Date 类的示例:

    dt <- as.Date("2010/02/10")
    new.dt <- dt - as.difftime(2, unit="days")
    

    您甚至可以使用不同的单位,例如周。

    【讨论】:

    • as.difftime 的有效单位是:“secs”、“mins”、“hours”、“days”、“weeks”。
    【解决方案3】:

    当然有lubridate 解决方案:

    library(lubridate)
    date <- "2009-10-01"
    
    ymd(date) - 5
    # [1] "2009-09-26"
    

    相同
    ymd(date) - days(5)
    # [1] "2009-09-26"
    

    其他时间格式可能是:

    ymd(date) - months(5)
    # [1] "2009-05-01"
    
    ymd(date) - years(5)
    # [1] "2004-10-01"
    
    ymd(date) - years(1) - months(2) - days(3)
    # [1] "2008-07-29"
    

    【讨论】:

    • 对于经常使用日期的人来说,lubridate 库是最直观的选择。
    • 绝对尝试使用 %m+%(和 %m-%)运算符在不破坏任何内容的情况下添加(减去)一个月到 1 月 31 日。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多