是否有 yday lubridate 函数的反函数?

Is there an inverse of the yday lubridate function?

我有一个日期列表,格式为 "day of the year",这是通过将 lubridate::yday() 函数应用于日期列表而获得的。例如,从以下日期开始(mm-dd-yyyy 格式):

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

通过应用 yday() 你得到

1
2
...

是否有函数可以在给定 yday 输出和年份的情况下进行反向操作?即,从 yday 值和年份返回到 mm-dd-yyyy 格式的日期?

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

添加到 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> 

所以又是一个所谓的 lubridate 问题,它与那个包无关,只是需要知道基本 R 类型是如何工作的。

就像@DirkEddelbuettel 的回答一样,因为我遇到了同样的问题并且已经 3 年了。

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

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

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

(我假设你有年份,因为那会影响闰年的日历日期 b/c,弄乱你的 month/day 分配。如果没有,任何年份都可以)

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"))



要使用 lubridate 程序包 执行此操作,请使用 parse_date_time() 函数并将 j 作为 order = 参数。

示例:

my.yday <- "1"
parse_date_time(x = my.yday, orders = "j") 
# [1] "2021-01-01 UTC"

默认值似乎是当年。如果您想指定年份,只需添加它!

my.yday <- "1"
parse_date_time(x = paste(1995, my.yday), orders = "yj")
# [1] "1995-01-01 UTC"

注意:确保您提供的儒略日是字符形式,而不是数字形式。如果是数字,超过 3 位数就会失败(他们不打算修复的奇怪错误)