2010-02-12 3 views
29

Я пытаюсь создать папки для хранения данных. Я хочу пометить папки в день этих данных в режиме pull.Как вычитать/добавить дни от/до даты?

Ex. Я тяну 5 дней назад данные от mysql. Я хочу назвать папку датой с 5 дней назад.

MySQL может легко обрабатывать арифметику даты. Я точно не знаю, как это делается R. Должен ли я просто вычесть соответствующее количество секунд в POSIXct и затем преобразовать в POSIXlt, чтобы назвать папку MM_DD_YYYY?

Или есть лучший способ?

ответ

61

Просто вычесть число:

> 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" 
+1

Или используйте POSIXct и вычтите стоимость в сутки. 'trunc()' и 'round()' также полезны для обрезки объектов POSIXt. – Sharpie

+0

ОК, который выглядит как лучший до сих пор. И только для того, чтобы быть уверенным, что он обрабатывает различные месячные дневные суммы и високосные годы правильно? – Dan

+0

Да, это все правильно. Вы можете выполнить быструю проверку самостоятельно, установив дату вокруг DST (например), чтобы подтвердить это, поскольку каждый подход может иметь другое поведение. – Shane

31

Ответ, вероятно, зависит от того, какого формата вашей даты находится, но вот пример использования Date класса:

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

Вы даже можете играть с различными единицами, как неделя.

+2

Допустимые единицы измерения для as.difftime: «secs», «mins», «hours», «days», «weeks». – jbaums

6

Существует, конечно, 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"