如何从/到日期减去/添加天数?

Dan*_*Dan 48 r date r-faq

我正在尝试构建文件夹以存储数据拉动.我想用拉动中的数据日标记文件夹.

防爆.我在5天前从mysql中提取数据我想将该文件夹命名为5天前的日期.

MySQL可以轻松处理日期算术.我不确定R是怎么做到的.我应该在POSIXct中减去适当的秒数然后转换为POSIXlt来命名文件夹MM_DD_YYYY吗?

或者,还有更好的方法?

Sha*_*ane 82

只需减去一个数字:

> as.Date("2009-10-01")
[1] "2009-10-01"
> as.Date("2009-10-01")-5
[1] "2009-09-26"
Run Code Online (Sandbox Code Playgroud)

由于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"
Run Code Online (Sandbox Code Playgroud)


Ani*_*iko 47

答案可能取决于您的日期格式,但以下是使用Date该类的示例:

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

你甚至可以玩几周不同的单位.

  • as.difftime的有效单位是:"secs","mins","hours","days","weeks". (6认同)

J_F*_*J_F 24

当然有一个lubridate解决方案:

library(lubridate)
date <- "2009-10-01"

ymd(date) - 5
# [1] "2009-09-26"
Run Code Online (Sandbox Code Playgroud)

是相同的

ymd(date) - days(5)
# [1] "2009-09-26"
Run Code Online (Sandbox Code Playgroud)

其他时间格式可能是:

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"
Run Code Online (Sandbox Code Playgroud)

  • 对于经常使用日期的人来说,lubridate 库是最直观的选择。 (2认同)