How to get the beginning of the day in POSIXct

≯℡__Kan透↙ 提交于 2019-12-13 14:15:37

问题


My day starts at 2016-03-02 00:00:00. Not 2016-03-02 00:00:01.

How do I get the beginning of the day in POSIXct in local time?

My confusing probably comes from the fact that R sees this as the end-date of 2016-03-01? Given that R uses an ISO 8601?

For example if I try to find the beginning of the day using Sys.Date():

as.POSIXct(Sys.Date(), tz = "CET")
"2016-03-01 01:00:00 CET"

Which is not correct - but are there other ways?

I know I can hack my way out using a simple

as.POSIXct(paste(Sys.Date(), "00:00:00", sep = " "), tz = "CET")

But there has to be a more correct way to do this? Base R preferred.


回答1:


It's a single command---but you want 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> 

It is only when converting to POSIXct happens that the timezone offset to UTC (six hours for me) enters:

R> as.POSIXct(Sys.Date())
[1] "2016-03-01 18:00:00 CST"
R> 

Needless to say by wrapping both you get the desired type and value:

R> as.POSIXct(as.POSIXlt(Sys.Date()))
[1] "2016-03-02 UTC"
R> 

Filed under once again no need for lubridate or other non-Base R packages.




回答2:


Notwithstanding that you understandably prefer base R, a "smart way," for certain meaning of "smart," would be:

library(lubridate)
x <- floor_date(Sys.Date(),"day")

> format(x,"%Y-%m-%d-%H-%M-%S")
[1] "2016-03-02-00-00-00"

From ?floor_date:

floor_date takes a date-time object and rounds it down to the nearest integer value of the specified time unit.

Pretty handy.




回答3:


Your example is a bit unclear.

You are talking about a 1 minute difference for the day start, but your example shows a 1 hour difference due to the timezone.

You can try

?POSIXct  

to get the functionality explained.

Using Sys.Date() withing POSIXct somehow overwrites your timezone setting.

as.POSIXct(Sys.Date(), tz="EET")  
 "2016-03-01 01:00:00 CET"  

While entering a string gives you

as.POSIXct("2016-03-01 00:00:00", tz="EET")  
 "2016-03-01 EET"

It looks like 00:00:00 is actually the beginning of the day. You can conclude it from the results of the following 2 inequalities

as.POSIXct("2016-03-02 00:00:02 CET")>as.POSIXct("2016-03-02 00:00:01 CET")

TRUE

as.POSIXct("2016-03-02 00:00:01 CET")>as.POSIXct("2016-03-02 00:00:00 CET")

TRUE

So somehow this is a timezone issue. Notice that 00:00:00 is automatically removed from the as.POSIXct result.

as.POSIXct("2016-03-02 00:00:00 CET")

"2016-03-02 CET"



来源:https://stackoverflow.com/questions/35720154/how-to-get-the-beginning-of-the-day-in-posixct

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!