像R中的Excel的日期函数一样的函数

我想要一个函数,它使用年,月和日的数据框的三列,并构造一个有效的日期对象。我希望行为的语法像Excel DATE function.Building on the answer to another question,我有以下功能:

我想要一个函数,它使用年,月和日的数据框的三列,并构造一个有效的日期对象。我希望行为的语法像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"))
  )
0

建立在 @ 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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(784)
在没有基本身份验证的情况下将ExchangeOnline与 Powershell连接
上一篇
你可以使用生成器函数做什么 (generator function python)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(66条)