季度数据 - 将因子转换为日期
Quarterly Data - Convert Factor to Date
无法将日期列从因子转换为日期类型。我试过 base r 和 lubridate 策略:
> as.Date(df)
Error in as.Date.default(x, ...) :
do not know how to convert 'x' to class “Date”
> yq(df)
[1] NA
Warning message:
All formats failed to parse. No formats found.
数据:
df<- structure(list(Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("2008-07-31",
"2009-07-31", "2010-07-31", "2011-07-31", "2012-07-31", "2013-07-31",
"2014-07-31", "2011-10-31", "2012-10-31", "2013-10-31", "2014-10-31",
"2016-10-31", "2017-10-31"), class = "factor")), row.names = c(NA,
6L), class = "data.frame")
上面的答案显示了基本的 R 方法来解决你的问题。我已经使用 tidyverse
包来做同样的事情,只是做事的方式不同。
首先,我们将查看您的数据
df<- structure(list(Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("2008-07-31",
"2009-07-31", "2010-07-31", "2011-07-31", "2012-07-31", "2013-07-31",
"2014-07-31", "2011-10-31", "2012-10-31", "2013-10-31", "2014-10-31",
"2016-10-31", "2017-10-31"), class = "factor")), row.names = c(NA,
6L), class = "data.frame")
print(df)
Date
1 2008-07-31
2 2008-07-31
3 2008-07-31
4 2008-07-31
5 2008-07-31
6 2008-07-31
如果我们看一下数据框的结构,我们可以看到日期存储为因子
str(df)
'data.frame': 6 obs. of 1 variable:
$ Date: Factor w/ 13 levels "2008-07-31","2009-07-31",..: 1 1 1 1 1 1
我们需要加载一些库。唯一需要解释的是 magrittr
包,它提供了方便的 %<>%
运算符,它将管道右侧的操作结果分配给原始变量
library(tidyverse)
library(lubridate)
library(magrittr)
所以在下面的管道中,我们 -
- 通过
as_tibble()
将日期的 df
数据框作为因子进行管道传输,将其转换为 tidyverse tibble 格式
- 然后使用
mutate
函数覆盖Date
列,
- 用
lubridate
函数 ymd
的结果替换它的值,这是一个方便的函数,可以在 year-month-date
结构中以因子或字符串格式解析日期。如果数据采用 day-month-year
格式,则等效项可能是 dmy
。
df %<>%
as_tibble() %>%
mutate(
Date = ymd(Date)
)
大功告成,我们可以看看数据了
print(df)
# A tibble: 6 x 1
Date
<date>
1 2008-07-31
2 2008-07-31
3 2008-07-31
4 2008-07-31
5 2008-07-31
6 2008-07-31
您现在可以看到日期现在存储为 date
数据类型。
最终评论-
如果你想手动创建数据表或者tibbles
,看看下面的tribble
函数,我们手动创建和你一样的tibble,然后投数据类型为 factor
df <- tribble(
~Date,
"2008-07-31",
"2009-07-31",
"2010-07-31",
"2011-07-31",
"2012-07-31",
"2013-07-31",
"2014-07-31",
"2011-10-31",
"2012-10-31",
"2013-10-31",
"2014-10-31",
"2016-10-31",
"2017-10-31")
df %<>%
mutate(
Date = as_factor(Date)
)
glimpse(df)
Observations: 13
Variables: 1
$ Date <fct> 2008-07-31, 2009-07-31, 2010-07-31, 2011-07-31, 2012-07-31, 2013-07-31, 2014-07-31, 2011-10-31, 2012-10-31, 2013-10-31, 2014-10-31...
将 as.Date
应用到 Date
列,而不是整个 data.frame。没有使用包。
transform(df, Date = as.Date(Date))
给予:
Date
1 2008-07-31
2 2008-07-31
3 2008-07-31
4 2008-07-31
5 2008-07-31
6 2008-07-31
无法将日期列从因子转换为日期类型。我试过 base r 和 lubridate 策略:
> as.Date(df)
Error in as.Date.default(x, ...) :
do not know how to convert 'x' to class “Date”
> yq(df)
[1] NA
Warning message:
All formats failed to parse. No formats found.
数据:
df<- structure(list(Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("2008-07-31",
"2009-07-31", "2010-07-31", "2011-07-31", "2012-07-31", "2013-07-31",
"2014-07-31", "2011-10-31", "2012-10-31", "2013-10-31", "2014-10-31",
"2016-10-31", "2017-10-31"), class = "factor")), row.names = c(NA,
6L), class = "data.frame")
上面的答案显示了基本的 R 方法来解决你的问题。我已经使用 tidyverse
包来做同样的事情,只是做事的方式不同。
首先,我们将查看您的数据
df<- structure(list(Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("2008-07-31",
"2009-07-31", "2010-07-31", "2011-07-31", "2012-07-31", "2013-07-31",
"2014-07-31", "2011-10-31", "2012-10-31", "2013-10-31", "2014-10-31",
"2016-10-31", "2017-10-31"), class = "factor")), row.names = c(NA,
6L), class = "data.frame")
print(df)
Date
1 2008-07-31
2 2008-07-31
3 2008-07-31
4 2008-07-31
5 2008-07-31
6 2008-07-31
如果我们看一下数据框的结构,我们可以看到日期存储为因子
str(df)
'data.frame': 6 obs. of 1 variable:
$ Date: Factor w/ 13 levels "2008-07-31","2009-07-31",..: 1 1 1 1 1 1
我们需要加载一些库。唯一需要解释的是 magrittr
包,它提供了方便的 %<>%
运算符,它将管道右侧的操作结果分配给原始变量
library(tidyverse)
library(lubridate)
library(magrittr)
所以在下面的管道中,我们 -
- 通过
as_tibble()
将日期的df
数据框作为因子进行管道传输,将其转换为 tidyverse tibble 格式 - 然后使用
mutate
函数覆盖Date
列, - 用
lubridate
函数ymd
的结果替换它的值,这是一个方便的函数,可以在year-month-date
结构中以因子或字符串格式解析日期。如果数据采用day-month-year
格式,则等效项可能是dmy
。
df %<>%
as_tibble() %>%
mutate(
Date = ymd(Date)
)
大功告成,我们可以看看数据了
print(df)
# A tibble: 6 x 1
Date
<date>
1 2008-07-31
2 2008-07-31
3 2008-07-31
4 2008-07-31
5 2008-07-31
6 2008-07-31
您现在可以看到日期现在存储为 date
数据类型。
最终评论-
如果你想手动创建数据表或者tibbles
,看看下面的tribble
函数,我们手动创建和你一样的tibble,然后投数据类型为 factor
df <- tribble(
~Date,
"2008-07-31",
"2009-07-31",
"2010-07-31",
"2011-07-31",
"2012-07-31",
"2013-07-31",
"2014-07-31",
"2011-10-31",
"2012-10-31",
"2013-10-31",
"2014-10-31",
"2016-10-31",
"2017-10-31")
df %<>%
mutate(
Date = as_factor(Date)
)
glimpse(df)
Observations: 13
Variables: 1
$ Date <fct> 2008-07-31, 2009-07-31, 2010-07-31, 2011-07-31, 2012-07-31, 2013-07-31, 2014-07-31, 2011-10-31, 2012-10-31, 2013-10-31, 2014-10-31...
将 as.Date
应用到 Date
列,而不是整个 data.frame。没有使用包。
transform(df, Date = as.Date(Date))
给予:
Date
1 2008-07-31
2 2008-07-31
3 2008-07-31
4 2008-07-31
5 2008-07-31
6 2008-07-31