我想要一个函数,它使用年,月和日的数据框的三列,并构造一个有效的日期对象。我希望行为的语法像Excel DATE function.Building on the answer to another question,我有以下功能:
ExcelDate <- function(yearCol, monthCol, dayCol) {
# Syntax: DATE(year,month,day)
# Requires lubridate and magrittr which are both in tidyverse
ReturnCol = paste(yearCol, monthCol, dayCol, sep="-") %>% ymd() %>% as.Date()
return(ReturnCol)
}
请注意,Excel 日期有一个相对于 1900 的整数编号系统,我不想复制,我只想要年 / 月 / 日输入格式和输出日期列作为日期对象。
但是,Excel 函数处理无效输入的方式对于日期算术非常有用。有关示例,请参见下图。基本上,每月的第 0 天是上个月的最后一天,第 0 个月是上xx年的最后一个月。超出正常月份长度的任何输入 t 天都将转换为下个月的第 t 天(如果需要,也可以转换为年份。
这里有很多复杂的边缘情况(不同的月份长度,闰年,输入在多个月或几年内转移),这使得我不愿意从头开始写这样的东西。
以下是将数据和所需答案加载到 R 中的示例代码:
df = data.frame(
year = c(2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, 2100),
month = c(2, 2, 2, 2, 13, 0, 2, 2, 2, 2, 2),
day = c(17, 30, -1, 0, 17, 17, 67, 670, 29, 29, 29),
date = mdy(c("2/17/2020", "3/1/2020", "1/30/2020", "1/31/2020", "1/17/2021", "12/17/2019", "4/7/2020", "12/1/2021", "2/29/2020", "3/1/2021", "3/1/2100"))
)
建立在 @ akrun 的评论(和调整,使其工作),我得到:
df = data.frame(
year = c(2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, 2100),
month = c(2, 2, 2, 2, 13, 0, 2, 2, 2, 2, 2),
day = c(17, 30, -1, 0, 17, 17, 67, 670, 29, 29, 29),
date = mdy(c("2/17/2020", "3/1/2020", "1/30/2020", "1/31/2020", "1/17/2021", "12/17/2019", "4/7/2020", "12/1/2021", "2/29/2020", "3/1/2021", "3/1/2100"))
)
df$candidate_date = with(df, ymd(year, truncated = 2) %m+% months(month-1) %m+% days(day-1))
df$candidate_date == df$date
返回:
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
或者,使用像我上面的例子中的函数:
ExcelDate <- function(yearCol, monthCol, dayCol) {
#Syntax: DATE(year,month,day)
# Requires lubridate
ReturnCol = ymd(yearCol, truncated = 2) %m+% months(monthCol-1) %m+% days(dayCol-1)
return(ReturnCol)
}
ExcelDate(df$year, df$month, df$day) == df$date
它还返回:
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(66条)