如何在R中的年,月,日和日期之间双向转换?

Hug*_*ins 12 datetime r type-conversion

如何在R中转换年,月,日和日期?

我知道人们可以通过字符串来做到这一点,但我宁愿避免转换为字符串,部分是因为可能会有性能损失?部分是因为我担心区域化问题,世界上有些人使用"年 - 月 - 日" "有些人使用"年 - 月 - 月".

看起来ISODate提供方向年,月,日 - > DateTime,虽然它首先将数字转换为字符串,所以如果有一种方法不通过字符串,那么我更喜欢.

从日期时间到数值,我找不到任何其他方面的东西?我宁愿不需要使用strsplit或类似的东西.

编辑:为了清楚,我所拥有的是一个数据框,看起来像:

year month day hour somevalue
2004 1     1   1   1515353
2004 1     1   2   3513535
....
Run Code Online (Sandbox Code Playgroud)

我希望能够自由转换为这种格式:

time(hour units) somevalue
1             1515353
2             3513535
....
Run Code Online (Sandbox Code Playgroud)

......还能再次回去.

编辑:清除一些关于'时间'(小时单位)意味着什么的混淆,最终我做了什么,并使用如何找到R中两个小时之间的差异的信息:

前进方向:

lh$time <- as.numeric( difftime(ISOdate(lh$year,lh$month,lh$day,lh$hour), ISOdate(2004,1,1,0), units="hours"))
lh$year <- NULL; lh$month <- NULL; lh$day <- NULL; lh$hour <- NULL
Run Code Online (Sandbox Code Playgroud)

向后方向:

......好吧,我还没做倒退,但我想象的是:

  • 用lh $ time创建difftime对象(不知怎的......)
  • 将ISOdate(2004,1,1,0)添加到difftime对象
  • 使用下面的解决方案之一来获得年,月,日,小时

我想在将来,我可以问我正在尝试解决的确切问题,但我试图将我的具体问题分解为通用的可重用问题,但也许这是一个错误?

Rei*_*son 19

因为有很多方法可以从文件,数据库等传递日期,并且因为你提到只是用不同的顺序或不同的分隔符编写,将输入的日期表示为字符串是一个方便和有用的解.R不将实际日期保存为字符串,您不需要将它们作为字符串处理以使用它们.

内部R使用操作系统以标准方式执行这些操作.你根本不需要操纵字符串 - 只是将一些东西从字符转换为它们的数字等价物.例如,在您可以部署的简单函数中包含两个操作(前向和后向)非常容易.

toDate <- function(year, month, day) {
    ISOdate(year, month, day)
}

toNumerics <- function(Date) {
    stopifnot(inherits(Date, c("Date", "POSIXt")))
    day <- as.numeric(strftime(Date, format = "%d"))
    month <- as.numeric(strftime(Date, format = "%m"))
    year <- as.numeric(strftime(Date, format = "%Y"))
    list(year = year, month = month, day = day)
}
Run Code Online (Sandbox Code Playgroud)

我放弃了strptime()对分离字符的单个调用和后续分割,因为你不喜欢这种操作.

> toDate(2004, 12, 21)
[1] "2004-12-21 12:00:00 GMT"
> toNumerics(toDate(2004, 12, 21))
$year
[1] 2004

$month
[1] 12

$day
[1] 21
Run Code Online (Sandbox Code Playgroud)

内部R的日期时间代码运行良好,并且由于时区问题等原因,如果位置有点复杂,则经过良好测试和稳健.我发现使用的习语toNumerics()比将日期时间作为列表更直观,并记住哪些元素是基于0的.基于所提供的功能看起来比试图避免字符串转换等更容易.

  • 或者使用`lubridate`,它为您提供`hour`,`year`,`hour`等功能. (2认同)

Use*_*716 9

我参加聚会有点晚了,但是从整数转换为日期的另一种方法是lubridate::make_date函数。请参阅以下来自 R for Data Science 的示例:

library(lubridate)
library(nycflights13)
library(tidyverse)

a <- flights %>%
  mutate(date = make_date(year, month, day))
Run Code Online (Sandbox Code Playgroud)