【问题标题】:Convert several data frame separate columns (year, dayOfYear, Hour, Min, Sec) into a date object/timestamp in R将几个数据框单独的列(年、日、年、小时、分钟、秒)转换为 R 中的日期对象/时间戳
【发布时间】:2013-02-20 02:54:20
【问题描述】:

首先,让我说我一直在寻找发布Dates and Times in separate columns, convert to datetime in R,但它不适用于这种情况。

我有一个包含多个测量值的 CSV 文件,其中从第 1 列到第 5 列,我有以下形式的数据戳:Year、DayOfYear、Hour、Minute、Second。 类似这样的 var 名称 dat:

  Year Day Hour Min  Sec. E1.S1 E1.S2 E1.S3 E1.S4 E1.S5 E1.S6 E1.S7 E1.S8 E2.S1 E2.S2 E2.S3 E2.S4 E2.S5
1 2003 241    0   1  5.87 0.296 0.394 0.657 0.427 0.362 0.559 0.460 0.460 0.526 0.362 0.362 0.493 0.460
2 2003 241    0   5 18.52 0.486 0.543 0.572 0.629 0.372 0.457 0.429 0.829 0.486 0.400 0.286 0.543 0.457
3 2003 241    0  10 10.65 0.514 0.629 0.371 0.657 0.457 0.657 0.429 0.429 0.314 0.400 0.286 0.286 0.343
4 2003 241    0  15  2.76 0.575 0.301 0.411 0.630 0.274 0.466 0.466 0.548 0.438 0.329 0.438 0.493 0.301
5 2003 241    0  20  7.06 0.329 0.274 0.657 0.329 0.521 0.247 0.356 0.246 0.411 0.356 0.438 0.520 0.356
6 2003 241    0  25 11.35 0.486 0.314 0.343 0.372 0.314 0.343 0.457 0.343 0.257 0.343 0.229 0.543 0.372

我需要在一个时间戳字段中“加入”所有这 5 个日期字段,以便我可以正确绘制数据并在 R 中使用它。

我查看了 ISOdatetime 函数,但我无法让它工作(而且它似乎没有 dayOfYear 字段)。我还查看了 POSIXlt 并尝试了类似的方法:

test = within(dat, datetime <- as.POSIXlt(paste(Year, Day, Hour, Min, Sec.),
                                          format = "%Y %D %H %M %S"))

但我得到的只是一个空的日期时间字段附加到我的数据框。

有什么想法吗?

编辑:

问题出在 dayOfYear 格式字段句柄中,正如下面帖子中指出的正确答案。我需要使用 %j 而不是 %D ,这足以获得日期时间的列。由于 POSIXlt 似乎只使用整数秒,我更正了秒数:

teste = within(dat, datetime <- as.POSIXlt(paste(Year, Day, Hour, Min, round(Sec.)),
                                          format = "%Y %j %H %M %S"))

谢谢大家!

【问题讨论】:

  • 尝试用括号包裹(datetime &lt;- ....),否则它不会离开它的范围
  • @RicardoSaporta 嗨,我试过了,结果是一样的。日期时间的 字段。

标签: r date dataframe


【解决方案1】:

这里是使用strptime 格式为 %j 的解决方案:以十进制数 (001–366) 表示一年中的日期。

我假设 dat 是您的 data.frame,首先我粘贴日期列

dat$date <- paste(paste(dat$Year,dat$Day,sep='/'),paste(dat$Hour,dat$Min,dat$Sec,sep=':'))

那我申请strptime

dat$date <- strptime(dat$date,format ='%Y/%j %H:%M:%S')

dat$date
[1] "2003-08-29 00:01:05" "2003-08-29 00:05:18" "2003-08-29 00:10:10" "2003-08-29 00:15:02" "2003-08-29 00:20:07" "2003-08-29 00:25:11"

PS : 这里所有的日期都是同一天

【讨论】:

  • 有效!更好的是,你放在那里的 %j ......我把它放在我的例子中而不是 %D ,现在它也可以工作了。我刚刚添加了回合(秒),因为 POSIXlt 和 strptime 似乎都没有考虑秒内的小数位。谢谢!
  • @jbssm !关键是 %j。 strptime 和 POSIXlt 使用相同的格式。
  • 是的,我现在明白了。为日期时间获得一个充满 的字段真是出乎意料(而不是解析错误的数据),所以我什至从没想过只是缺少那个小细节。再次感谢您的帮助。
猜你喜欢
  • 2012-11-06
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多