【问题标题】:How to reformat 20140101 into a valid date format such as 2014-01-01 [duplicate]如何将 20140101 重新格式化为有效的日期格式,例如 2014-01-01 [重复]
【发布时间】:2016-03-09 20:12:24
【问题描述】:

我已经导入了一些数据。问题是日期的格式为例如 20140101。

标准格式是 2014-01-01,当我尝试 as.Date(datecolumn, format = '%Y-%m-&d) 时,我得到了非常奇怪的年份值。

如何快速有效地将我的日期转换为标准日期格式?

我可以使用paste0来做到这一点,但肯定有更好的方法吗?

输出

> head(backup)
  quote_date   open   high    low  close volume value
1   20151203 263.10 263.10 263.10 263.10      0     0
2   20151202 264.51 264.51 264.51 264.51      0     0
3   20151201 261.91 261.91 261.91 261.91      0     0
4   20151130 260.68 260.68 260.68 260.68      0     0
5   20151127 256.75 256.75 256.75 256.75      0     0
6   20151125 253.93 253.93 253.93 253.93      0     0
> str(backup)
'data.frame':   960 obs. of  7 variables:
 $ quote_date: int  20151203 20151202 20151201 20151130 20151127 20151125 20151124 20151123 20151120 20151119 ...
 $ open      : num  263 265 262 261 257 ...
 $ high      : num  263 265 262 261 257 ...
 $ low       : num  263 265 262 261 257 ...
 $ close     : num  263 265 262 261 257 ...
 $ volume    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ value     : int  0 0 0 0 0 0 0 0 0 0 ...

> head(as.Date(backup$quote_date, format = '%Y%m%d'))
[1] NA NA NA NA NA NA

【问题讨论】:

  • as.Date(datecolumn, format = '%Y%m%d') ?
  • format 参数适用于数据已经采用的格式,而不是您要使其成为的格式。 help(as.Date)
  • 当我使用 format = '%Y%m%d' 我得到所有返回值的 NA。
  • @uncool 请注意,这些值是以整数形式读入的,因此要应用的第一个函数是as.character,然后as.Date 将应用正确的转换。有两种不同的as.Date 函数,一种用于数值,另一种用于数值。
  • ...此外,您声称已运行的代码有问题,因为将整数传递给as.Date() 而不指定origin 将返回错误,而不是NA,因为记录在?as.Date

标签: r date


【解决方案1】:

像@joran 一样,我认为使用格式参数将整数传递给 as.Date 会出错,但事实并非如此:

> dt <- c(20151203, 20151202, 20151201, 20151130, 20151127, 20151125 ,20151124, 20151123 )
> head(as.Date(dt, format = '%Y%m%d'))
[1] NA NA NA NA NA NA
> 
> str(dt)
 num [1:8] 20151203 20151202 20151201 20151130 20151127 ...
> mode(dt) <- "integer"
> str(dt)
 int [1:8] 20151203 20151202 20151201 20151130 20151127 20151125 20151124 20151123
> head(as.Date(dt, format = '%Y%m%d'))
[1] NA NA NA NA NA NA
> as.Date(dt, format = '%Y%m%d')
[1] NA NA NA NA NA NA NA NA
> as.Date(as.character(dt), format = '%Y%m%d')
[1] "2015-12-03" "2015-12-02" "2015-12-01" "2015-11-30" "2015-11-27" "2015-11-25" "2015-11-24"
[8] "2015-11-23"

与 joran 不同,当我查看 as.Date.numeric 的代码时,我发现在缺少 origin 时不会抛出任何错误,只会替换为大多数人认为合理的默认值:

if (missing(origin)) 
        origin <- "1970-01-01"
if (identical(origin, "0000-00-00")) 
    origin <- as.Date("0000-01-01", ...) - 1
as.Date(origin, ...) + x

等等...我现在看到我有&lt;environment: namespace:zoo&gt;,我怀疑这是我们分歧的根源。以前在 SO 中也出现过这种情况。

zoo 包掩盖了基础-as.Date.numeric

【讨论】:

  • 你还需要来自因子变量的as.character
  • 是的,这是真的。但他(和我们)都没有考虑 as.Date。
  • 必须是 R 版本的差异...? Here's 指向与我似乎拥有的源相匹配的源链接......啊哈,我现在看到你的编辑了。这就解释了。
  • 我想我们以前见过这个谜题。将尝试搜索[r] zoo as.Date
  • 请注意,当您加载 zoo 时,您会收到一条消息,as.Dateas.Date.numeric 被屏蔽。运行conflicts() R 函数也会报告这一点。修改是严格向上兼容的——不需要原点的附加功能会在没有 zoo 的情况下出错。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多