r - 使用 "lubridate"包编写 R 函数,该函数接受日期(例如 ."August 14")并返回十二生肖

标签 r date lubridate

声明:编写一个函数,接受日期作为输入并返回与该日期对应的黄道十二宫的星座(使用Lubridate包)。

问题:当我输入“12 月 22 日”和“1 月 19 日”之间的任何日期时。它返回NULLymd 应返回 2017-12-22 UTC--2018-01-19 UTC 而不是 2017-12-22 UTC--2017-01-19 UTC

是否有更好的方法来生成 Date/POSIx 数据的间隔?

zodiac_sign <- function(input){

  library(lubridate)

  input <- ymd(as.character(as.Date(input,format="%B %d")))

  x <- as.Date(c("March 21","April 19","April 20","May 20","May 21","June 20","June 21","July 22","July 23","August 22","August 23","September 22","September 23","October 22","October 23","November 21","November 22","December 21","December 22","January 19","January 20","February 18","February 19","March 20"),format="%B %d")

  x_dateform_char <- as.character(x)

  lst <- list()

  for(i in seq(1,length(x_dateform_char),2)) { 
    lst[[i]] <- c(ymd(x_dateform_char[i]) %--% ymd(x_dateform_char[i+1]))
    if(i==(length(x_dateform_char)-1)){
      break 
    }
  }

  lst <- lst[!sapply(lst, is.null)]

  names(lst) <-
    c("Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittari
      us","Capricorn","Aquarius","Pisces")

  lst

  for(i in 1:length(lst)){
    if(input %within% lst[[i]]){ 
      sign <- names(lst)[i] 
    } }
  sign 
}

最佳答案

星座通常取决于日期,月份和年份没有任何作用。因此我想尝试一下完全忽略评估逻辑中的年份部分。

我考虑的逻辑是基于日期(一个月的)来划分该月的星座。然后只需从输入值中显式考虑部分即可。

zodiac_sign <- function(input){
  library(lubridate)

  input <- ymd(as.character(as.Date(input,format="%B %d")))

  # Define data.frame for zodiac_sign
  zodiac_sign_df <- data.frame(Month = c("March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "January", "February"),
                               Zodiac_Separation_Dt = c(21, 20, 21, 21, 23, 23, 23, 23, 22, 22, 20, 19),
                               LowerSideZS = c("Pisces", "Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius"),
                               UpperSideZS = c("Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius", "Pisces"),
                               stringsAsFactors = FALSE )

  # Filter data with matching month
  val_df <- zodiac_sign_df[zodiac_sign_df$Month == months(input), ] 


  zodiac_sign <- ifelse( day(input) >= val_df$Zodiac_Separation_Dt, val_df$UpperSideZS, val_df$LowerSideZS)  

  zodiac_sign
}

上述逻辑中使用的 zodiac_sign_df 如下所示:

> zodiac_sign_df
       Month Zodiac_Separation_Dt LowerSideZS UpperSideZS
1      March                   21      Pisces       Aries
2      April                   20       Aries      Taurus
3        May                   21      Taurus      Gemini
4       June                   21      Gemini      Cancer
5       July                   23      Cancer         Leo
6     August                   23         Leo       Virgo
7  September                   23       Virgo       Libra
8    October                   23       Libra     Scorpio
9   November                   22     Scorpio Sagittarius
10  December                   22 Sagittarius   Capricorn
11   January                   20   Capricorn    Aquarius
12  February                   19    Aquarius      Pisces

关于r - 使用 "lubridate"包编写 R 函数,该函数接受日期(例如 ."August 14")并返回十二生肖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026462/

相关文章:

r - 按 ID 将数据帧分成 10 天的间隔

C# 读取 csv,计算一些东西,导出另一个 csv

PHP 解析日期字符串

r - 如果条件包含 lubridate 包中的 `years` 函数,ifelse 命令总是返回 0

r - 从网站上抓取链接 - R

r - 具有多个组件的RHadoop key

r - dplyr 更新 data.frame 中的单元格

Unix:在别名中使用日期不会输出当前日期/时间

r - 将日期时间转换为格式化的时间字符串

R 从今天的日期减去 1 个月给出 NA