web-dev-qa-db-ja.com

基本R機能を使用してPOSIX日付(POSIXct)を丸める

現在、作成しているパッケージの日付と時刻をいろいろと試しています。

これに偶然出会った post は、contribパッケージを使用する前に、基本的なR機能で何かを実行できるかどうかを確認することは、一般的には悪い考えではないことを改めて思い出させました。

したがって、ベースR機能でクラスPOSIXctの日付を丸めることは可能ですか?

私はチェックした

methods(round)

「のみ」が私に与えた

[1] round.Date      round.timeDate*

   Non-visible functions are asterisked

これは私がやりたいことです(擬似コード)

x <- as.POSIXct(Sys.time())
[1] "2012-07-04 10:33:55 CEST"

round(x, atom="minute")
[1] "2012-07-04 10:34:00 CEST"

round(x, atom="hour")
[1] "2012-07-04 11:00:00 CEST"

round(x, atom="day")
[1] "2012-07-04 CEST"

timeDatelubridate などを使用してこれを実行できることはわかっていますが、パッケージの依存関係を低く抑えたいと思います。したがって、先に進んでそれぞれのパッケージのソースコードをチェックアウトする前に、誰かがすでにこのようなことをしているかどうか尋ねたいと思いました。

32
Rappster

baseにはround.POSIXt これをする。なぜmethodsにならないのかわからない。

x <- as.POSIXct(Sys.time())
x
[1] "2012-07-04 10:01:08 BST"
round(x,"mins")
[1] "2012-07-04 10:01:00 BST"
round(x,"hours")
[1] "2012-07-04 10:00:00 BST"
round(x,"days")
[1] "2012-07-04"
43
James

lubridateを使用したこのテーマについて、ceiling_date()関数とfloor_date()関数も調べます。

x <- as.POSIXct("2009-08-03 12:01:59.23")
ceiling_date(x, "second")
# "2009-08-03 12:02:00 CDT"
ceiling_date(x, "hour")
# "2009-08-03 13:00:00 CDT"
ceiling_date(x, "day")
# "2009-08-04 CDT"
ceiling_date(x, "week")
# "2009-08-09 CDT"
ceiling_date(x, "month")
# "2009-09-01 CDT"
14
nzcoops

外部ライブラリを呼び出さず、POSIXctを保持したい場合、これは1つのアイデアです( この質問 に触発されます):strptimeを使用して偽の月と日を貼り付けます。 このコメント で述べられているように、もっと簡単にそれを行うことができるはずです

「strptimeの場合、入力文字列は日付を完全に指定する必要はありません。指定されていない秒、分、または時間はゼロであり、指定されていない年、月、または日が現在のものであると想定されます。」

したがって、あなたはを使用する必要があるようですstrftimeを使用して切り捨てられた文字列を出力し、欠落している部分を貼り付け、POSIXctで再度変換します。

これは、更新の回答がどのように見えるかです。

x <- as.POSIXct(Sys.time())
x
[1] "2018-12-27 10:58:51 CET"
round(x,"mins")
[1] "2018-12-27 10:59:00 CET"
round(x,"hours")
[1] "2018-12-27 11:00:00 CET"
round(x,"days")
[1] "2018-12-27 CET"
as.POSIXct(paste0(strftime(x,format="%Y-%m"),"-01"))     #trunc by month
[1] "2018-12-01 CET"
as.POSIXct(paste0(strftime(x,format="%Y"),"-01-01"))     #trunc by year
[1] "2018-01-01 CET"
1
Simon C.