R包从日期和小时(整数)构造时间对象
R package constructing time objects from date and hour(integer)
我以日期的形式提供了数据(格式 "YYYY-MM-DD",例如“2015-03-11”,一天中的小时数为 (0-23)。
生成以下形式的时间对象最方便的方法是什么
"2015-03-11" and hour = 0 -> "2015-03-11 00:00"
"2015-03-11" and hour = 1 -> "2015-03-11 01:00"
"2015-03-11" and hour = 2 -> "2015-03-11 02:00"
我可以使用 Base 中的 Date 函数或 xts 或 timeDate 中的某些函数。
应该很容易,但我相信有人很快就知道了。
编辑:数据分两列提供,一列用于日期,一列用于数字。
你不需要外部包来做到这一点。
如果您的数据是这种格式:
df=data.frame(date=c("2015-03-11","2015-03-11","2015-03-11"),hour=0:2)
只需应用以下函数:
format(as.POSIXct(df$date)+df$hour*60*60, format = "%Y-%m-%d %H:%M")
试试这个。如果您愿意,您可以在之后使用 format
立即格式化它,但我认为最好将它保留在 POSIXct
class 中,这样您就可以在后面操作它(添加删除天数,秒数,等等)
as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H")
## [1] "2015-03-11 00:00:00 IST" "2015-03-11 01:00:00 IST" "2015-03-11 02:00:00 IST"
不过,如果您坚持要准确输出,这里是 format
的解决方案
format(as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H"), "%Y-%m-%d %H:%M")
## [1] "2015-03-11 00:00" "2015-03-11 01:00" "2015-03-11 02:00"
数据
df <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "2015-03-11", class = "factor"),
V2 = 0:2), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA,
-3L))
你可以试试
dtime <- with(df, as.POSIXct(sprintf('%s %02d', date, hour),
format = "%Y-%m-%d %H"))
然后像其他帖子一样使用format
或者
library(lubridate)
ymd_h(with(df, sprintf('%s %02d', date, hour)))
或者稍微紧凑一些
ymd_h(do.call(paste, df))
假设我们有这样的输入:
date <- c("2015-03-11", "2015-03-12")
hour <- 2:3
然后尝试其中之一:
1) 计时
library(chron)
as.chron(date) + hour/24
给予:
[1] (03/11/15 02:00:00) (03/12/15 03:00:00)
2) POSIXct。这个只使用 R 的基础,没有包:
as.POSIXct(date) + 3600 * hour
在我的系统上给予:
[1] "2015-03-11 02:00:00 EDT" "2015-03-12 03:00:00 EDT"
如果您想要 UTC 时区的结果,请使用:
as.POSIXct(date, tz = "UTC") + 3600 * hour
3) 润滑
library(lubridate)
ymd(date) + hours(hour)
给予:
[1] "2015-03-11 02:00:00 UTC" "2015-03-12 03:00:00 UTC"
如果你想在当前时区使用它,那么:
ymd(date, tz = "") + hours(hour)
请注意,chron 解决方案提供了 date/time class,它不使用时区,消除了时区可能导致的许多问题。 POSIXct 和 lubridate 解决方案在特定时区给出 date/time,如图所示。
我以日期的形式提供了数据(格式 "YYYY-MM-DD",例如“2015-03-11”,一天中的小时数为 (0-23)。
生成以下形式的时间对象最方便的方法是什么
"2015-03-11" and hour = 0 -> "2015-03-11 00:00"
"2015-03-11" and hour = 1 -> "2015-03-11 01:00"
"2015-03-11" and hour = 2 -> "2015-03-11 02:00"
我可以使用 Base 中的 Date 函数或 xts 或 timeDate 中的某些函数。 应该很容易,但我相信有人很快就知道了。
编辑:数据分两列提供,一列用于日期,一列用于数字。
你不需要外部包来做到这一点。
如果您的数据是这种格式:
df=data.frame(date=c("2015-03-11","2015-03-11","2015-03-11"),hour=0:2)
只需应用以下函数:
format(as.POSIXct(df$date)+df$hour*60*60, format = "%Y-%m-%d %H:%M")
试试这个。如果您愿意,您可以在之后使用 format
立即格式化它,但我认为最好将它保留在 POSIXct
class 中,这样您就可以在后面操作它(添加删除天数,秒数,等等)
as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H")
## [1] "2015-03-11 00:00:00 IST" "2015-03-11 01:00:00 IST" "2015-03-11 02:00:00 IST"
不过,如果您坚持要准确输出,这里是 format
format(as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H"), "%Y-%m-%d %H:%M")
## [1] "2015-03-11 00:00" "2015-03-11 01:00" "2015-03-11 02:00"
数据
df <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "2015-03-11", class = "factor"),
V2 = 0:2), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA,
-3L))
你可以试试
dtime <- with(df, as.POSIXct(sprintf('%s %02d', date, hour),
format = "%Y-%m-%d %H"))
然后像其他帖子一样使用format
或者
library(lubridate)
ymd_h(with(df, sprintf('%s %02d', date, hour)))
或者稍微紧凑一些
ymd_h(do.call(paste, df))
假设我们有这样的输入:
date <- c("2015-03-11", "2015-03-12")
hour <- 2:3
然后尝试其中之一:
1) 计时
library(chron)
as.chron(date) + hour/24
给予:
[1] (03/11/15 02:00:00) (03/12/15 03:00:00)
2) POSIXct。这个只使用 R 的基础,没有包:
as.POSIXct(date) + 3600 * hour
在我的系统上给予:
[1] "2015-03-11 02:00:00 EDT" "2015-03-12 03:00:00 EDT"
如果您想要 UTC 时区的结果,请使用:
as.POSIXct(date, tz = "UTC") + 3600 * hour
3) 润滑
library(lubridate)
ymd(date) + hours(hour)
给予:
[1] "2015-03-11 02:00:00 UTC" "2015-03-12 03:00:00 UTC"
如果你想在当前时区使用它,那么:
ymd(date, tz = "") + hours(hour)
请注意,chron 解决方案提供了 date/time class,它不使用时区,消除了时区可能导致的许多问题。 POSIXct 和 lubridate 解决方案在特定时区给出 date/time,如图所示。