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

如何在R中的年、月、日和日期之间进行双向转换?,r,datetime,type-conversion,R,Datetime,Type Conversion,如何在R中转换年、月、日和日期 我知道可以通过字符串来实现这一点,但我更愿意避免转换为字符串,部分原因是可能会出现性能问题,部分原因是我担心区域化问题,世界上有些国家使用“年-月-日”,有些国家使用“年-日-月” 看起来ISODate提供了年、月、日->日期时间的方向,尽管它确实首先将数字转换为字符串,所以如果有一种方法不通过字符串,那么我更喜欢 我找不到任何相反的东西,从日期时间到数值?我宁愿不需要使用strsplit或类似的东西 编辑:我要说的是,我有一个数据框,看起来像: year mon

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

我知道可以通过字符串来实现这一点,但我更愿意避免转换为字符串,部分原因是可能会出现性能问题,部分原因是我担心区域化问题,世界上有些国家使用“年-月-日”,有些国家使用“年-日-月”

看起来ISODate提供了年、月、日->日期时间的方向,尽管它确实首先将数字转换为字符串,所以如果有一种方法不通过字符串,那么我更喜欢

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

编辑:我要说的是,我有一个数据框,看起来像:

year month day hour somevalue
2004 1     1   1   1515353
2004 1     1   2   3513535
....
我希望能够自由转换为以下格式:

time(hour units) somevalue
1             1515353
2             3513535
....
。。。而且还能再回去

编辑:为了澄清一些关于“时间”(小时单位)含义的混淆,我最终做的是,使用以下信息:

前进方向:

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

lh$time找到了一种从日期到年、月、日的解决方案

假设我们有一个日期对象,我们将在这里使用ISOdate创建它:

somedate <- ISOdate(2004,12,21)
给出:

$sec
[1] 0

$min
[1] 0

$hour
[1] 12

$mday
[1] 21

$mon
[1] 11

$year
[1] 104
然后你就可以得到你想要的,例如:

unclass(as.POSIXlt(somedate))$mon

请注意,$year是[实际年份]-1900,month是以0为基础的,mday是以1为基础的(根据POSIX标准)

,因为有很多方法可以从文件、数据库等中传递日期,并且您提到的原因只是以不同的顺序或使用不同的分隔符编写,将输入的日期表示为字符串是一种方便而有用的解决方案。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)
}

在内部,R的datetime代码运行良好,并且经过良好测试,如果由于时区问题等原因在某些地方有点复杂,那么它会非常健壮。
toNumerics()
中使用的习惯用法比将日期时间作为列表并记住哪些元素是基于0的更直观。基于所提供的功能似乎比试图避免字符串转换等更容易。

我来晚了一点,但另一种从整数转换为日期的方法是
lubridate::make_date
函数。请参见下面R中有关数据科学的示例:

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

a <- flights %>%
  mutate(date = make_date(year, month, day))
库(lubridate)
图书馆(nycflights13)
图书馆(tidyverse)
a%
变更(日期=制造日期(年、月、日))

这里已经回答了很多问题,还有R杂志/R新闻文章。关于这个话题,有许多几乎相同的问题。这里有一个问题:问题是什么?您是否坚决反对内部转换为字符串,以至于只接受从不进行转换的答案,或者您只是对问题的标题感兴趣?如果是这样的话,
ISOdate()
似乎完全可以接受。如果将标题改写为“如何在日期和年、月、日之间转换?”(不需要“R”,该信息包含在标记中…)您能澄清您的示例吗(可能在经过一些睡眠之后),因为它看起来像是以小时为单位的
time\u
可以从
hour
列中提取?你的笔记不值得一个“:-O”。这些是POSIX标准。如果您不喜欢,请使用
格式
格式(ISOdate(2004,12,21),“%m”)
ISOdate
不返回字符串,正如
?ISOdate
所说,它是
strptime
的包装器,并返回一个
POSIXct
类对象。我们根本不必转换为字符串。看看java的joda time,它是一个非常易于使用的类。因为问R的一个阿基里斯脚跟而贬低我并不会让我感觉更好,因为到目前为止,我已经花了90分钟试图弄清楚这一点……请不要把被贬低为“贬低”混为一谈——你会知道当一个Mod对你的答案/问题做了些什么,因为它们由一个蓝色钻石标识。投票是网站和相关网站的重要组成部分。习惯它,不要把它看得太严重。这无助于没有人真正回答我关于r日期和时间的问题,而只是说这是“显而易见的”。如果这是显而易见的,我就不会问这些问题了…@HughPerkins我第一次在R中使用日期时遇到了类似的问题(请参见)。您可以使用
attributes
函数查看可用字段的名称,这很公平。我想我只是有点紧张,可能会有本地化问题?我被烧死过很多次,因为区域设置会影响月日顺序。(编辑:嗯,我猜,字符串听起来不是处理数字的最高性能方式吗?)请注意,我在任何地方都不能创建“XX-XX-YYYY”形式的字符串,其中“XX”中的哪一个表示日期或月份可能存在歧义。我使用经过良好测试的函数来提取日期/时间内部表示的特定部分,并使其适当。当我要求日部分时,我总是得到日部分等。本地化只在两个地方出现。i) 获取日期/时间的字符表示形式时,但始终可以通过传递字符串和该字符串的格式来处理。ii)POSIXt表示法有时区,可能会有点混乱。但这是R如何在内部处理日期时间的问题,而与字符表示无关。@HughPerkins:区域设置不会影响日-月顺序,即使它们会影响o
> 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
library(lubridate)
library(nycflights13)
library(tidyverse)

a <- flights %>%
  mutate(date = make_date(year, month, day))