是否有 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 位数就会失败(他们不打算修复的奇怪错误)
我有一个日期列表,格式为 "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 位数就会失败(他们不打算修复的奇怪错误)