Extract Date in R

后端 未结 3 1558
名媛妹妹
名媛妹妹 2021-01-03 07:50

I struggle mightily with dates in R and could do this pretty easily in SPSS, but I would love to stay within R for my project.

I have a date column in my data fram

相关标签:
3条回答
  • 2021-01-03 08:10
    > d = as.Date("2003-10-09", format="%Y-%m-%d")
    > format(d, "%m-%d")
    [1] "10-09"
    
    0 讨论(0)
  • 2021-01-03 08:24

    Is this what you are looking for?

    library(ggplot2)
    ## make up data for two seasons a and b
    a = as.Date("2010/10/1")
    b = as.Date("2011/10/1")
    a.date <- seq(a, by='1 week', length=28)
    b.date <- seq(b, by='1 week', length=28)
    
    ## make up some score data  
    a.score <- abs(trunc(rnorm(28, mean = 10, sd = 5)))
    b.score <- abs(trunc(rnorm(28, mean = 10, sd = 5)))
    
    ## create a data frame   
    df <- data.frame(a.date, b.date, a.score, b.score)
    df
    
    ## Since I am using ggplot I better create a "long formated" data frame
    df.molt <- melt(df, measure.vars = c("a.score", "b.score"))
    levels(df.molt$variable) <- c("First season", "Second season")
    df.molt
    

    Then, I am using ggplot2 for plotting the data:

    ## plot it
    ggplot(aes(y = value, x = a.date), data = df.molt) + geom_point() +   
    geom_line() + facet_wrap(~variable, ncol = 1) + 
    scale_x_date("Date", format = "%m-%d")
    

    If you want to modify the x-axis (e.g., display format), then you'll probably be interested in scale_date.

    enter image description here

    0 讨论(0)
  • 2021-01-03 08:27

    You have to remember Date is a numeric format, representing the number of days passed since the "origin" of the internal date counting :

    > str(Date)
    Class 'Date'  num [1:10] 14245 14360 14475 14590 14705 ...
    

    This is the same as in EXCEL, if you want a reference. Hence the solution with format as perfectly valid.

    Now if you want to set the first date of a year as October 1st, you can construct some year index like this :

    redefine.year <- function(x,start="10-1"){
      year <- as.numeric(strftime(x,"%Y"))
      yearstart <- as.Date(paste(year,start,sep="-"))
    
      year + (x >= yearstart) - min(year) + 1
    }
    

    Testing code :

    Start <- as.Date("2009-1-1")    
    Stop <- as.Date("2011-11-1")
    Date <- seq(Start,Stop,length.out=10)
    
    data.frame( Date=as.character(Date),
                year=redefine.year(Date))
    

    gives

             Date year
    1  2009-01-01    1
    2  2009-04-25    1
    3  2009-08-18    1
    4  2009-12-11    2
    5  2010-04-05    2
    6  2010-07-29    2
    7  2010-11-21    3
    8  2011-03-16    3
    9  2011-07-09    3
    10 2011-11-01    4
    
    0 讨论(0)
提交回复
热议问题