如何在 POSIXct 中获取一天的开始
How to get the beginning of the day in POSIXct
我的一天从 2016-03-02 00:00:00
开始。不是 2016-03-02 00:00:01
。
如何获取本地时间 POSIXct
一天的开始?
我的困惑可能来自于 R 将此视为 2016-03-01 的结束日期?鉴于 R 使用 ISO 8601?
例如,如果我尝试使用 Sys.Date() 查找一天的开始:
as.POSIXct(Sys.Date(), tz = "CET")
"2016-03-01 01:00:00 CET"
哪个不正确 - 但还有其他方法吗?
我知道我可以用一个简单的方法解决问题
as.POSIXct(paste(Sys.Date(), "00:00:00", sep = " "), tz = "CET")
但必须有更正确的方法来做到这一点?首选碱基 R。
你的例子有点不清楚。
你说的是一天开始时有 1 分钟的差异,但你的示例显示由于时区的原因有 1 小时的差异。
你可以试试
?POSIXct
了解功能说明。
在 POSIXct 中使用 Sys.Date() 会以某种方式覆盖您的时区设置。
as.POSIXct(Sys.Date(), tz="EET")
"2016-03-01 01:00:00 CET"
虽然输入字符串会给您
as.POSIXct("2016-03-01 00:00:00", tz="EET")
"2016-03-01 EET"
看起来00:00:00实际上是一天的开始。从下面2个不等式的结果可以得出结论
as.POSIXct("2016-03-02 00:00:02 CET")>as.POSIXct("2016-03-02 00:00:01 CET")
正确
as.POSIXct("2016-03-02 00:00:01 CET")>as.POSIXct("2016-03-02 00:00:00 CET")
正确
所以这是一个时区问题。请注意,00:00:00 会自动从 as.POSIXct 结果中删除。
as.POSIXct("2016-03-02 00:00:00 CET")
"2016-03-02 CET"
尽管您更喜欢 base R 是可以理解的,但对于 "smart," 的某些含义,"smart way," 将是:
library(lubridate)
x <- floor_date(Sys.Date(),"day")
> format(x,"%Y-%m-%d-%H-%M-%S")
[1] "2016-03-02-00-00-00"
来自?floor_date
:
floor_date takes a date-time object and rounds it down to the nearest
integer value of the specified time unit.
非常方便。
这是一个命令---但你想要 as.POSIXlt()
:
R> as.POSIXlt(Sys.Date())
[1] "2016-03-02 UTC"
R> format(as.POSIXlt(Sys.Date()), "%Y-%m-%d %H:%M:%S")
[1] "2016-03-02 00:00:00"
R>
只有当转换为POSIXct
时,UTC的时区偏移量(我是6小时)才会输入:
R> as.POSIXct(Sys.Date())
[1] "2016-03-01 18:00:00 CST"
R>
不用说,通过包装你得到想要的 type 和 value:
R> as.POSIXct(as.POSIXlt(Sys.Date()))
[1] "2016-03-02 UTC"
R>
再次提交不需要 lubridate 或其他非 Base R 包。
我的一天从 2016-03-02 00:00:00
开始。不是 2016-03-02 00:00:01
。
如何获取本地时间 POSIXct
一天的开始?
我的困惑可能来自于 R 将此视为 2016-03-01 的结束日期?鉴于 R 使用 ISO 8601?
例如,如果我尝试使用 Sys.Date() 查找一天的开始:
as.POSIXct(Sys.Date(), tz = "CET")
"2016-03-01 01:00:00 CET"
哪个不正确 - 但还有其他方法吗?
我知道我可以用一个简单的方法解决问题
as.POSIXct(paste(Sys.Date(), "00:00:00", sep = " "), tz = "CET")
但必须有更正确的方法来做到这一点?首选碱基 R。
你的例子有点不清楚。
你说的是一天开始时有 1 分钟的差异,但你的示例显示由于时区的原因有 1 小时的差异。
你可以试试
?POSIXct
了解功能说明。
在 POSIXct 中使用 Sys.Date() 会以某种方式覆盖您的时区设置。
as.POSIXct(Sys.Date(), tz="EET")
"2016-03-01 01:00:00 CET"
虽然输入字符串会给您
as.POSIXct("2016-03-01 00:00:00", tz="EET")
"2016-03-01 EET"
看起来00:00:00实际上是一天的开始。从下面2个不等式的结果可以得出结论
as.POSIXct("2016-03-02 00:00:02 CET")>as.POSIXct("2016-03-02 00:00:01 CET")
正确
as.POSIXct("2016-03-02 00:00:01 CET")>as.POSIXct("2016-03-02 00:00:00 CET")
正确
所以这是一个时区问题。请注意,00:00:00 会自动从 as.POSIXct 结果中删除。
as.POSIXct("2016-03-02 00:00:00 CET")
"2016-03-02 CET"
尽管您更喜欢 base R 是可以理解的,但对于 "smart," 的某些含义,"smart way," 将是:
library(lubridate)
x <- floor_date(Sys.Date(),"day")
> format(x,"%Y-%m-%d-%H-%M-%S")
[1] "2016-03-02-00-00-00"
来自?floor_date
:
floor_date takes a date-time object and rounds it down to the nearest integer value of the specified time unit.
非常方便。
这是一个命令---但你想要 as.POSIXlt()
:
R> as.POSIXlt(Sys.Date())
[1] "2016-03-02 UTC"
R> format(as.POSIXlt(Sys.Date()), "%Y-%m-%d %H:%M:%S")
[1] "2016-03-02 00:00:00"
R>
只有当转换为POSIXct
时,UTC的时区偏移量(我是6小时)才会输入:
R> as.POSIXct(Sys.Date())
[1] "2016-03-01 18:00:00 CST"
R>
不用说,通过包装你得到想要的 type 和 value:
R> as.POSIXct(as.POSIXlt(Sys.Date()))
[1] "2016-03-02 UTC"
R>
再次提交不需要 lubridate 或其他非 Base R 包。