【问题标题】:converting Int Dates to Date variable lubridate将 Int Dates 转换为 Date 变量 lubridate
【发布时间】:2020-07-24 23:29:57
【问题描述】:

我有一个数据框,其中有一列日期为整数,例如192606 192607 等。 我的日期值只是年和月 我想将此整数形式更改为日期形式,以便将它们绘制在时间序列图中(ggplot)

我尝试使用 lubridate,但收到错误消息。

sss[,1]<-ymd(sss[,1])

编辑:

数据可以在这里找到:https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html

我正在处理 25 个投资组合,按规模和预定上市率排序

编辑 2:

这是我的数据框的输出。 感谢您的快速帮助!谢谢

str(sss) 编号 [1:1122, 1:5] 192607 192608 192609 192610 192611 ... - attr(*, "dimnames")=2 个列表 ..$ : 空 ..$ : chr [1:5] "Time" "Intercept" "Mkt" "smb" ...

【问题讨论】:

  • 这些数字是否来自 Excel 工作表? MATLAB?它们的起源是什么?
  • 数字来自一个csv文件是的,并且被导入到RStdio并转换为一个数据框
  • 192606 的等效日期是多少?
  • 1926 年 7 月

标签: r date lubridate


【解决方案1】:

看看这是否有帮助。
问题似乎是这些数字不应该被视为数字,而是以"YYYYMM" 格式编码日期的字符串。所以要强制到 R 类 "Date",首先粘贴一天 01 然后强制使用 as.Date

sss <- matrix(
  c(192607, 192608, 192609, 192610, 192611, 192612, 192701, 192702, 
    192703, 192704, 192705, 192706, 192707, 192708, 192709, 192710, 
    192711, 192712, 192801, 192802, 192803, 192804, 192805, 192806, 
    192807), 
  ncol = 1)

d <- as.Date(paste0(sss[, 1], "01"), format = "%Y%m%d")
head(d)
#[1] "1926-07-01" "1926-08-01" "1926-09-01" "1926-10-01" "1926-11-01"
#[6] "1926-12-01"

【讨论】:

  • @TheRipper7000 查看新代码。我相信就是这样。
  • 如何将此输出更改为矩阵,以便将其与另一个矩阵组合?
  • @TheRipper7000 如果你想cbind(other_mat, d)这个输出是可以的。如果数据集不是矩阵而是data.frame,那么df$newcol &lt;- d 会这样做。你能举例说明你的意思吗?
【解决方案2】:

ymd 要求它是一个字符向量,其日期顺序可以是任何格式的年、月、日,只要日期是该顺序即可。您的列是整数类型,因此违反了这些规则。因此,要么使用来自 base 的 as.Date(),要么使用来自 lubridateas_date()

as.Date(192606)
"2497-05-03"
lubridate::as_date(192606)
"2497-05-03"

因此,对于您的数据:

sss[,1] <- as_date(sss[,1])

如果数据不是数字:

sss[,1] <- as_date(as.numeric(sss[,1]))

由于格式是 YearMonth,我们可以使用:

library(zoo)
sss[,1] <-  as.yearmon(as.character(sss[,1, drop = T]), "%Y%m")

head(sss[,1])
# A tibble: 6 x 1
  Date     
  <yearmon>
1 Jul 1926 
2 Aug 1926 
3 Sep 1926 
4 Oct 1926 
5 Nov 1926 
6 Dec 1926 

如果sss 是一个矩阵,则将as.character() 包裹在as.yearmon 调用周围。这是因为,对于矩阵,所有数据必须是同一时间的。当类型混合时,所有数据都被强制转换为因子。这就是为什么你会得到你所做的价值观。因此,在将数据强制转换为因子之前,将列转换为字符。

sss[,1] <- as.character(as.yearmon(as.character(test[,1]), "%Y%m"))

虽然这可行,但在处理这样的数据时,您可能应该坚持使用数据帧。

【讨论】:

  • 我的专栏有大约1200个日期,我不会专门写一个
  • sss[,1]
  • 您确定该列是数字吗?它可能是类型字符或因子。请使用str(sss) 的输出编辑您的答案
  • 感谢您的帮助!我尝试了 as_Date 并将我的输出更改为不同的时间--> 192606 变为 2497-05-04。基本的 as.Date() 说我需要一个来源
  • 直到看到Fama和French的数据,我才意识到日期的格式。我发布的最终代码现在可以使用了。
猜你喜欢
  • 2020-07-18
  • 2020-07-08
  • 2017-07-05
  • 1970-01-01
  • 2012-09-02
  • 2014-06-05
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多