是否有yday lubridate函数的倒数?

时间:2016-12-08 00:04:23

标签: r date-arithmetic

我通过将lubridate :: yday()函数应用于日期列表获得的格式为“一年中的日期”的日期列表。例如,从以下日期(mm-dd-yyyy格式):

01-01-2015
01-02-2015
...

通过应用yday()得到

1
2
...

在给定yday输出和年份的情况下,是否有可以执行相反的功能?即,从yday值和一年开始,回到mm-dd-yyyy格式的日期?

3 个答案:

答案 0 :(得分:1)

添加到Date()类型的任何序列都会创建一个只有该偏移量的新Date()序列。

证人:

R> as.Date("2016-01-01") + 0:9
 [1] "2016-01-01" "2016-01-02" "2016-01-03"
 [4] "2016-01-04" "2016-01-05" "2016-01-06"
 [7] "2016-01-07" "2016-01-08" "2016-01-09"
[10] "2016-01-10"
R> as.Date("2016-01-01") + 100:109
 [1] "2016-04-10" "2016-04-11" "2016-04-12"
 [4] "2016-04-13" "2016-04-14" "2016-04-15"
 [7] "2016-04-16" "2016-04-17" "2016-04-18"
[10] "2016-04-19"
R> 

所以再一次所谓的润滑问题与该软件包无关,只需要知道基本R类型如何运作。

答案 1 :(得分:0)

> yday ("1990-03-17") - 1 + as.Date ("1990-01-01")
[1] "1990-03-17"

答案 2 :(得分:0)

由于我遇到了同样的问题,已经有3年了,所以就像@DirkEddelbuettel给出的答案一样。

为了获得给定数据集的所需mm-dd-yyyy,其中由于lubridate::yday()而只有年份和日历日。

对于从1月1日开始的给定年份,您只需要偏移Date()类型的对象,您的yday()输出将减去1。

然后,如果要获取该月中的月份或日期,则可以使用lubridate的month()day()函数提取这些部分。

(我认为您所拥有的年份会影响leap年的日历日期b / c,弄乱您的月/日分配。如果没有,那么任何年份都可以)

library(dplyr)
library(magrittr)

#Example dataset with years on/around leap year
my_df <- data.frame(
  year = c(2010, 2011, 2012, 2013, 2014, 2015),
  my_yday = c(150, 150, 150, 150, 150, 150)
)


#skip straight back to the yyyy-mm-dd format
my_df %>% mutate(new_date = as.Date(paste0(year, "-01-01")) + (my_yday - 1))

#Get every component
my_df %>%
  mutate(
    new_day   = lubridate::day(as.Date(str_c(year, "-01-01")) + (my_yday - 1)),
    new_month = lubridate::month(as.Date(paste0(year, "-01-01")) + (my_yday - 1)),
    new_date  = as.POSIXct(str_c(new_month, new_day, year, sep = "/"), 
                           format = "%m/%d/%y"))