R ddate格式“%Y-%V”问题

时间:2018-01-31 12:17:01

标签: r strptime as.date

我不明白以下行为:

format(as.Date("2017-01-01"), "%Y-%V")
[1] "2017-52"
> as.Date("2017-01-01")
[1] "2017-01-01"
> format(as.Date("2017-01-01")-1, "%Y-%V")
[1] "2016-52"

作为第一排的输出,我期待得到2016-52而不是2017-52,因为1月1日是一周,2017年不到4天。

关于出了什么问题的任何想法?

> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server >= 2012 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] parallel  splines   stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] plotly_4.7.1       highcharter_0.5.0  flexdashboard_0.5  xts_0.10-0         zoo_1.8-0         
 [6] rmdformats_0.3.3   dygraphs_1.1.1.4   pROC_1.10.0        elasticnet_1.1     lars_1.2          
[11] here_0.1           brew_1.0-6         Hmisc_4.0-3        Formula_1.2-2      stringr_1.2.0     
[16] devtools_1.13.3    RODBC_1.3-15       caret_6.0-77       testthat_1.0.2     rmarkdown_1.6     
[21] gbm_2.1.3          lattice_0.20-35    survival_2.41-3    data.table_1.10.4  rgdal_1.2-11      
[26] sp_1.2-5           colorRamps_2.3     gridExtra_2.3      DT_0.2             knitr_1.17        
[31] reshape2_1.4.2     scales_0.5.0.9000  ggmap_2.6.1        dplyr_0.7.3        purrr_0.2.3       
[36] readr_1.1.1        tidyr_0.7.1        tibble_1.3.4       ggplot2_2.2.1.9000 tidyverse_1.1.1   
[41] pacman_0.4.6      

loaded via a namespace (and not attached):
 [1] readxl_1.0.0        backports_1.1.0     plyr_1.8.4          igraph_1.1.2       
 [5] lazyeval_0.2.1      digest_0.6.12       foreach_1.4.3       htmltools_0.3.6    
 [9] magrittr_1.5        checkmate_1.8.3     memoise_1.1.0       cluster_2.0.6      
[13] recipes_0.1.0       modelr_0.1.1        gower_0.1.2         dimRed_0.1.0       
[17] jpeg_0.1-8          colorspace_1.3-2    rvest_0.3.2         haven_1.1.0        
[21] crayon_1.3.4        jsonlite_1.5        bindr_0.1           iterators_1.0.8    
[25] glue_1.1.1          DRR_0.0.2           gtable_0.2.0        ipred_0.9-6        
[29] questionr_0.6.1     kernlab_0.9-25      ddalpha_1.2.1       quantmod_0.4-11    
[33] DEoptimR_1.0-8      maps_3.2.0          miniUI_0.1.1        Rcpp_0.12.14       
[37] viridisLite_0.2.0   xtable_1.8-2        htmlTable_1.9       foreign_0.8-69     
[41] mapproj_1.2-5       stats4_3.4.1        lava_1.5            prodlim_1.6.1      
[45] htmlwidgets_0.9     httr_1.3.1          RColorBrewer_1.1-2  geosphere_1.5-5    
[49] acepack_1.4.1       pkgconfig_2.0.1     nnet_7.3-12         rlang_0.1.2        
[53] munsell_0.4.3       cellranger_1.1.0    tools_3.4.1         broom_0.4.2        
[57] evaluate_0.10.1     yaml_2.1.14         ModelMetrics_1.1.0  robustbase_0.92-7  
[61] RgoogleMaps_1.4.1   bindrcpp_0.2        nlme_3.1-131        mime_0.5           
[65] RcppRoll_0.2.2      xml2_1.1.1          compiler_3.4.1      rstudioapi_0.7     
[69] curl_2.8.1          png_0.1-7           stringi_1.1.5       highr_0.6          
[73] forcats_0.2.0       Matrix_1.2-10       psych_1.7.8         httpuv_1.3.5       
[77] R6_2.2.2            latticeExtra_0.6-28 bookdown_0.5        codetools_0.2-15   
[81] MASS_7.3-47         assertthat_0.2.0    CVST_0.2-1          proto_1.0.0        
[85] rprojroot_1.2       rjson_0.2.15        withr_2.1.0.9000    mnormt_1.5-5       
[89] rlist_0.4.6.1       hms_0.3             grid_3.4.1          rpart_4.1-11       
[93] timeDate_3012.100   class_7.3-14        TTR_0.23-2          shiny_1.0.5        
[97] lubridate_1.6.0     base64enc_0.1-3  

1 个答案:

答案 0 :(得分:4)

您的机器没有问题,它的运作方式

> format(as.Date("2018-01-01"), "%Y-%V")
[1] "2018-01"
> format(as.Date("2017-01-01"), "%Y-%V")
[1] "2017-52"
  

%V

     

如果包含1月1日的一周(从星期一开始)有四个或更多   新的一天,然后它被认为是第1周。否则,它是   上一年的最后一周,下一周是第1周。   (已接受但在输入时被忽略。)年份中的星期几为ISO 8601中定义的十进制数字(01-53)。

第52周结果的说明:

来自维基百科ISO 8601

  

如果1月1日是星期一,星期二,星期三或星期四,那么它就在   第01周。如果1月1日是星期五,星期六或星期日,那么它就在   上一年的第52周或第53周(没有第00周)。 12月28日   总是在一年的最后一周。

为什么同年?

因为它是Week-based-year而不是我们的日历年。

来自Wikiedpia的更多例子:

ISO周编号年从第01周的第一天(星期一)开始,到新ISO年份之前的星期日结束(因此没有重叠或差距)。它包括52或53整周。一年中的第一个ISO周最多可能有三天,实际上正在公历年结束;如果三,他们是星期一,星期二和星期三。同样,一年中的最后一个ISO周可能最多有三天实际上是公历年开始的;如果三,他们是星期五,星期六和星期日。每个ISO周的星期四总是在由ISO周编号年表示的公历年。

示例:

Monday 29 December 2008 is written "2009-W01-1"
Sunday 3 January 2010 is written "2009-W53-7"

TL:博士;这是ISO 8601的行为,与R无关。为了克服这个问题,最好使用%U

> format(as.Date("2017-01-01"), "%Y-%U")
[1] "2017-01"
> format(as.Date("2016-01-01"), "%Y-%U")
[1] "2016-00"
> format(as.Date("2016-01-02"), "%Y-%U")
[1] "2016-00"
> format(as.Date("2016-12-02"), "%Y-%U")
[1] "2016-48"
> format(as.Date("2016-12-31"), "%Y-%U")
[1] "2016-52"