【问题标题】:Combine day,month,year,hour to date time in R在R中结合日,月,年,小时到日期时间
【发布时间】:2017-10-24 07:59:23
【问题描述】:
day   month     year    hour
01     05      2017     00
05     12      2017     01
10     07      2017     23

我没有分钟和秒列现在我试图以

的格式获取单个变量作为 date_time
2017-05-01 00:00:00
2017-12-05 01:00:00
2017-07-10 23:00:00

使用以下代码时出现错误

df$date <- as.Date(with(df, paste(year, month, day,hour,sep="-")),
           "%Y-%m-%d %H:%M:%S") 

提前致谢

【问题讨论】:

  • paste(year, month, day,hour,sep="-") 会给你"2017-05-01-00",它与你给出的格式不匹配。此外,as.Date 不会为您提供所需的格式。

标签: r


【解决方案1】:

我们可以试试paste列和sprintf,然后用as.POSIXct转换成日期时间

as.POSIXct(do.call(sprintf, c(df1, fmt = c("%02d-%02d-%4d %02d"))), format = "%d-%m-%Y %H")
#[1] "2017-05-01 00:00:00 IST" "2017-12-05 01:00:00 IST" "2017-07-10 23:00:00 IST"

或使用lubridate

library(lubridate)
with(df1, ymd_h(paste(year, month, day, hour, sep= ' ')))

【讨论】:

  • 谢谢@akrun ,它怎么能考虑年,月,日,...得到o/p
  • 我们是否需要将上述变量的因子转换为字符才能使用 lubridate 获得输出>
  • @snr999 答案中的那个不是您显示的预期输出
  • @snr999 好的,我认为您的列是 numeric,因为它是数字。所以,如果你有 factor 类。在尝试解决方案之前尝试df1[] &lt;- lapply(df1, function(x) as.numeric(as.character(x)))。只需更改为 character 也适用于 lubridate
  • 嗨 akrun,在将它们全部转换为“Num”格式后,粘贴错误(年、月、日、小时、sep = “”):无法将“闭包”类型强制转换为向量类型'字符'
【解决方案2】:

既然年、月、日、小时存储在不同的列中,为什么不直接使用ISOdate 函数呢?例如:

> ISOdate("2017","12", "05", "01")
[1] "2017-12-05 01:00:00 GMT"

如果您不想查看时区信息,只需将ISOdate 包装为as.Date

> as.Date(ISOdate("2017","12", "05", "01"))
[1] "2017-12-05"

但这会将对象的类从 POSIXct 更改为 Date 并且(如果我错了,请纠正我)并没有真正删除时区信息。

这在另一个问题How to convert in both directions between year,month,day and dates in R?中讨论过

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2014-03-12
    • 2022-06-28
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多