【问题标题】:R strptime Monday date from weeknumber weirdR strptime Monday date from weeknumber 奇怪
【发布时间】:2016-11-19 18:23:18
【问题描述】:

我在这里犯了一个小错误,但无法弄清楚问题所在。

我需要获取随机日期的一周中的星期一的日期.. 似乎我得到了完全不同的东西

mydate <- date("2013-11-05")

format(mydate, "%A")           # this is Tuesday, right
#[1] "Tuesday"
month(mydate)                  # Month November, right
#[1] 11
myyr <- year(mydate); myyr     # year is 2013, right
#[1] 2013
day(mydate)                    # day number is 5, right
#[1] 5 
mywk <- isoweek(mydate);mywk   # weeknumber is 45, right (yes, not US convention here)
#[1] 45
format(mydate, "%V")           # weeknumber is 45, right as well
#[1] "45" 
# Monday of week 45 is 2013-11-04 but strptime following gives something else...

strptime(paste0(myyr, "Monday", mywk), "%Y%A%V")
#[1] "2013-11-19 EET" 
# and for checking

strptime("2013Monday45","%Y%A%V")
#[1] "2013-11-19 EET"

提前致谢

【问题讨论】:

  • 目前尚不清楚您想要给定日期的确切日期,但也许这会有所帮助:d &lt;- as.Date("2013-11-05"); d - as.numeric(format(d, "%w")) + 1
  • 看到%V根据?strpitimeAccepted but ignored on input。请改用%W

标签: r iso8601 strptime date-conversion week-number


【解决方案1】:

基本上,您只需要 Gabor 的评论。这是一个完整的功能:

mondayForGivenDate <- function(d) { 
    if (class(d) != "Date") d <- anytime::anydate(d)
    d - as.POSIXlt(d)$wday + 1
}

为今天(星期六)、下星期一和上星期六运行此命令会得到您期望的三个不同的星期一:

R> mondayForGivenDate(Sys.Date())
[1] "2016-11-14"
R> mondayForGivenDate(Sys.Date()+2)
[1] "2016-11-21"
R> mondayForGivenDate(Sys.Date()-7)
[1] "2016-11-07"
R> 

使用anytime 中的anydate() 函数是可选的,但很好,因为您现在可以使用许多不同的输入格式:

R> mondayForGivenDate(20161119)
[1] "2016-11-14"
R> mondayForGivenDate("20161119")
[1] "2016-11-14"
R> mondayForGivenDate("2016-11-19")
[1] "2016-11-14"
R> mondayForGivenDate("2016-Nov-19")
[1] "2016-11-14"
R> 

再次强调,关键点是在 R 中使用正确的 Date 和/或 POSIXt,它们几乎总是给你需要的东西——在这种情况下是 @星期几的 987654328@ 组件需要恢复为星期几。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多