我通过将lubridate :: yday()函数应用于日期列表获得的格式为“一年中的日期”的日期列表。例如,从以下日期(mm-dd-yyyy格式):
01-01-2015
01-02-2015
...
通过应用yday()得到
1
2
...
在给定yday输出和年份的情况下,是否有可以执行相反的功能?即,从yday值和一年开始,回到mm-dd-yyyy格式的日期?
答案 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"))