【问题标题】:Extract Date in R在 R 中提取日期
【发布时间】:2011-03-31 00:56:11
【问题描述】:

我在 R 中的日期非常困难,并且可以在 SPSS 中轻松做到这一点,但我希望在我的项目中留在 R 中。

我的数据框中有一个日期列,并且想要完全删除年份以保留月份和日期。这是我原始数据的一个峰值。

> head(ds$date)
[1] "2003-10-09" "2003-10-11" "2003-10-13" "2003-10-15" "2003-10-18" "2003-10-20"
> class((ds$date))
[1] "Date"

我“想要”它。

> head(ds$date)
[1] "10-09" "10-11" "10-13" "10-15" "10-18" "10-20"
> class((ds$date))
[1] "Date"

如果可能,我希望将第一个日期设置为 10 月 1 日而不是 1 月 1 日。

您能提供的任何帮助将不胜感激。

编辑:我觉得我应该添加一些上下文。我想绘制一个 NHL 球员在 10 月开始到 4 月结束的赛季中的表现。除此之外,我想按每个季节对图进行分面,这是我数据框中的一个单独列。因为我想比较整个赛季的累积表现,我认为我需要删除年份部分,但也许我不需要;正如我所指出的,我在 R 中遇到了日期问题。我希望完成的是一个按季节比较相对日期的累积性能的图,并且 x 轴从 10 月开始到 4 月结束。

【问题讨论】:

  • 在 user678105 的回答 cmets 中,您询问“mm-yy”是否可以保持为“日期”值。您是在尝试对值本身进行计算还是为了显示?

标签: datetime r


【解决方案1】:
> d = as.Date("2003-10-09", format="%Y-%m-%d")
> format(d, "%m-%d")
[1] "10-09"

【讨论】:

  • 谢谢,但这会将其存储为字符。我可以将该结果放回日期形式吗?
  • @Btibert3:您应该区分date 变量包含的内容以及它的显示方式。如果您想隐藏年份以进行显示,上面的代码可以完成这项工作,但日期本身保持不变。
  • 很好的答案。 R 中有许多灵活的日期格式选项,用于以各种方式提取和显示日期组件。请参阅格式帮助。
【解决方案2】:

这就是你要找的吗?

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

然后,我使用ggplot2 来绘制数据:

## 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")

如果您想修改 x 轴(例如,显示格式),那么您可能会对 scale_date 感兴趣。

【讨论】:

  • 几乎!我唯一需要的是图表的左侧应该从十月开始,因为那是季节开始的时候。换句话说,从左到右阅读时,轴的范围应为 10 月至 4 月。这就是我要挂断的部分。谢谢你的帮助!
【解决方案3】:

你要记住 Date 是一种数字格式,表示自内部日期计数的“起源”以来经过的天数:

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

这和 EXCEL 中的一样,如果你想参考的话。因此,格式为完全有效的解决方案。

现在如果你想将一年的第一个日期设置为 10 月 1 日,你可以像这样构造一些年份索引:

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
}

测试代码:

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))

给予

         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

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2020-10-24
    • 2017-01-05
    相关资源
    最近更新 更多