【问题标题】:Lubridate round_date() seems to change time zone when rounding to dayLubridate round_date() 在四舍五入时似乎会改变时区
【发布时间】:2017-04-27 14:01:48
【问题描述】:

我正在尝试四舍五入(到当天)日期时间数据。数据如下所示:

> date[10:15]
[1] "2016-08-31 23:03:02 EDT" "2016-08-31 22:52:50 EDT"
[3] "2016-08-31 22:50:02 EDT" "2016-08-31 22:34:28 EDT"
[5] "2016-08-31 22:31:41 EDT" "2016-08-31 22:25:37 EDT"

问题是当我使用lubridate 函数round_date() 将日期“四舍五入”为仅年、月、日部分时,日期似乎已更改为 UTC(注意:UTC 约为 5 小时在 EDT 之前,所以 00:40:17 EDT05:40:17 UTC,如果我理解正确的话):

> date_r
[1] "2016-09-01 EDT" "2016-09-01 EDT" "2016-09-01 EDT"
[4] "2016-09-01 EDT" "2016-09-01 EDT" "2016-09-01 EDT"

这是一个代表:

structure(c(1472698982, 1472698370, 1472698202, 1472697268, 1472697101, 
1472696737), class = c("POSIXct", "POSIXt"), tzone = "America/Detroit")

date_r <- round_date(date, unit = "day")

如果日期在 EDT 中包含 8-31,我会尝试将四舍五入的日期设置为 8-31(而不是 9-1)。四舍五入时如何保留时区?开放给非Lubridate 的答案。

【问题讨论】:

  • format(d, "%Y-%m-%d")
  • R 日期始终为 UTC。打印和格式化功能是本地化的。
  • @d.b 有效
  • @42- 谢谢,但这似乎并没有解决如何将它们四舍五入以供使用,例如,在时间序列图中,它们需要在哪里?
  • 请尝试阅读以了解含义。如果您了解“四舍五入”到 Date 将在内部表示级别上完成,那么您的结果是有意义的,并且“格式”功能不会四舍五入而是“地板”。

标签: r datetime lubridate


【解决方案1】:

您可以在基础 R 中使用 strptime

d = structure(c(1472698982, 1472698370, 1472698202, 1472697268, 1472697101, 
     1472696737), class = c("POSIXct", "POSIXt"), tzone = "America/Detroit")

strptime(d, format = "%Y-%m-%d", tz = "America/Detroit")
#OR
#strptime(d, format = "%Y-%m-%d", tz = attr(d, "tzone"))
#[1] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"
#[4] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"

或使用floor_datelubridate

library(lubridate)
floor_date(d, unit = "day")
#[1] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"
#[4] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"

【讨论】:

  • 谢谢,format(d, "%Y-%m-%d") 似乎也可以正常工作,我认为
  • @JoshuaRosenberg,我认为答案中的方法更好,因为输出不是字符串
  • 对于我的情况,floor_date() 返回 POSIXct 类型日期,striptime() 返回 POSIXlt 类型日期(POSIXctfloor_date() 方法帮助了我更轻松地创建我的时间序列 - 看起来 dplyr::count()POSIXlt 日期类型视为一个字符,而另一个仍然是一个日期(这是我需要的!)。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2012-08-04
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多