datetime - 如何将字符数据框转换为相应的日期?

标签 datetime r apply

我已经多次注意到使用日期不允许使用 R 中的常用技巧。假设我有一个带日期的数据框数据(见下文),我想将完整的数据框转换为日期类(class)。到目前为止,我唯一能想到的解决方案是:

for (i in 1:ncol(Data)){
    Data[,i] <- as.Date(Data[,i],format="%d %B %Y")
}

这给出了一个具有正确结构的数据框:

> str(Data)
'data.frame':   6 obs. of  4 variables:
 $ Rep1:Class 'Date'  num [1:6] 12898 12898 13907 13907 13907 ...
 $ Rep2:Class 'Date'  num [1:6] 13278 13278 14217 14217 14217 ...
 $ Rep3:Class 'Date'  num [1:6] 13600 13600 14340 14340 14340 ...
 $ Rep4:Class 'Date'  num [1:6] 13831 13831 14669 14669 14669 ...

使用经典的应用方法给出了完全不同的东西。尽管所有变量都属于同一类并且属于同一类,但我无法获得正确类的数据框或矩阵作为输出:

> str(sapply(Data,as.Date,format="%d %B %Y"))
 num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"
> str(apply(Data,2,as.Date,format="%d %B %Y"))
 num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"

如果你想在 Date 对象中再次转换这些矩阵,你需要一个原点。该来源可能因系统而异,因此在 apply() 之后使用 as.Date 或其他函数也无济于事。如果你应用原点,你会再次得到一个向量。

任何人都可以为此类数据提供干净的解决方案?下面是我在示例中使用的数据框。

Data <- structure(list(Rep1 = c(" 25 April 2005 ", " 25 April 2005 ", 
" 29 January 2008 ", " 29 January 2008 ", " 29 January 2008 ", 
" 29 January 2008 "), Rep2 = c(" 10 May 2006 ", " 10 May 2006 ", 
" 4 December 2008 ", " 4 December 2008 ", " 4 December 2008 ", 
" 4 December 2008 "), Rep3 = c(" 28 March 2007 ", " 28 March 2007 ", 
" 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 "
), Rep4 = c(" 14 November 2007 ", " 14 November 2007 ", " 1 March 2010 ", 
" 1 March 2010 ", " 1 March 2010 ", " 1 March 2010 ")), .Names = c("Rep1", 
"Rep2", "Rep3", "Rep4"), row.names = c("1", "2", "3", "4", "5", 
"6"), class = "data.frame")

最佳答案

我认为最简洁的方法是:

Data[] <- lapply(Data, as.Date,format="%d %B %Y")

这也很好地概括了并非所有列都是日期的情况:

Data[date_col] <- lapply(Data[date_col], as.Date,format="%d %B %Y")

您还可以使用其他几个包简化日期解析

library(stringr)
library(lubridate)
Data[] <- lapply(Data, function(x) dmy(str_trim(x)))

有点冗长,但优点是您无需自己弄清楚数据格式。

关于datetime - 如何将字符数据框转换为相应的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3599851/

相关文章:

python - 使用频率和周期的日期范围

c# - 显示日期和时间选择器的 Asp.Net 4 WebControl

python - 为什么在使用 pandas apply 时会出现 AttributeError?

javascript - 如何使用 jQuery 将 ISO 8601 格式的日期转换为时间戳?

regex - 提取某个单词后的数字

r - ggplot2:主题集、pdf 导出和 Illustrator 遇到困难

r - 如何在 Shiny eventReactive 处理程序中监听多个事件表达式

python - 如何在 Pandas 数据帧切片中使用 apply 来设置多列的值

r - 将函数应用于数据框的子集但保留整个数据框

python - 如果键与今天的日期匹配,则在 python 中打印值字段