鉴于任何一年,如何在去年获得相同的工作日?

时间:2017-01-21 02:11:38

标签: r date dayofweek

我想在去年的同一天获得任何一年。我怎样才能在R中做到最好。例如,在2010/01/03周日,我想获得前一年同一周的星期日。

# "Sunday"
weekdays(as.Date("2010/01/03", format="%Y/%m/%d"))

# "Saturday"
weekdays(as.Date("2009/01/03", format="%Y/%m/%d"))

4 个答案:

答案 0 :(得分:2)

要查找一年前的同一个工作日,只需从给定日期减去52周或364天:

d <- as.Date("2010-01-03")
weekdays(d)
#[1] "Sunday"
d - 52L * 7L
#[1] "2009-01-04"
weekdays(d - 52L * 7L)
#[1] "Sunday"

请注意,日历年有365天(或闰年为366天),超过52周一天或两天。因此,一年前同一个工作日的日历日期会持续一到两天。 (或者,它解释了为什么新年前夜总是在不同的工作日。)

答案 1 :(得分:0)

使用lubridate,以下公式将为您提供上一年同一周的相应工作日:

as.Date(dDate - 364 - ifelse(weekdays( dDate - 363) == weekdays( dDate ), 1, 0))

dDate是某个日期,即dDate <- as.Date("2016-02-29")ifelse说明了闰年。

答案 2 :(得分:0)

这是一个简单的算法。从利息当天减去365天。使用下面的Tableau代码将这一天调整为最接近星期几(可轻松翻译成其他语言)。这等效于下表中的规则(1 =星期一,7 =星期日)。基本上,您将日期-365调整为同一周中的正确日期(如果移动的时间少于或等于3天),否则您使用前一周/后一周的匹配工作日。它会选择天数差异最小的那个。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, uint uMsg, int wParam, int lParam);

private const uint WM_VSCROLL = 0x0115;
private const int SB_THUMBPOSITION = 4;

enter image description here

答案 3 :(得分:-1)

看一下包装中的年数。这会创建一个周期对象,在闰年中正确跨越一段时间。

> library(lubridate)
> # set the reference date
> d1 = as.Date("2017/01/03", format="%Y/%m/%d")
> 
> # verify across years and leap years
> d1 - years(1)
[1] "2016-01-03"
> d1 - years(2)
[1] "2015-01-03"
> d1 - years(3)
[1] "2014-01-03"
> d1 - years(4)
[1] "2013-01-03"
> d1 - years(5)
[1] "2012-01-03"
> 
> weekdays(d1 - years(1))
[1] "Sunday"
> weekdays(d1 - years(2))
[1] "Saturday"
> 
> # feb 29 on year period in yields NA
> ymd("2016/02/29") - years(1)
[1] NA
> 
> # feb 29 in a non-leap year fails to convert
> ymd("2015/02/29") - years(1)
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> 
> # feb 29, leap year with 4 year period works.
> ymd("2016/02/29") - years(4)
[1] "2012-02-29"
>