2017-11-04 8 views
0

問題がある場合はsqldfと& POSIXctです。私はPSTとPDTが混在しているが、上の移動、なぜ日にMIN_DATEをバックに変換する方法についてsqldfとPOSIXct

user.mindate <- sqldf("select min(u.created_on) as min_date 
       from user u") 
> user.mindate 
    min_date 
1 1380749081 

> as.Date(user.mindate$min_date,tz="America/Los_Angeles") 
[1] "3782332-08-02" 

任意の提案...任意の助け

Sys.setenv(TZ = "America/Los_Angeles") 
user <- read.csv("user_ori.csv",stringsAsFactors=FALSE) 
user$created_on <- as.POSIXct(user$created_on,format="%Y-%m-%d %H:%M:%S",tz="America/Los_Angeles") 

head(user$created_on) 
[1] "2017-02-15 19:39:10 PST" "2016-05-11 22:44:58 PDT" 
[3] "2017-02-06 19:25:48 PST" "2016-09-22 22:25:50 PDT" 
[5] "2016-07-11 10:36:58 PDT" "2015-02-23 20:42:12 PST" 

わからないを理解するだろうか?

は、 ジョン

+0

'PDT'と' PST'のミックスすることができDSTのために(明日の朝に起きる、それ以下)。 – r2evans

答えて

1

問題は、SQLiteのは、何の日時の種類を持っていないということです。 RはPOSIXctオブジェクトを1970-01-01(Epoch)からの秒数で保存します。対応する型がないので、そのようなオブジェクトがSQLiteに送信されると、生の秒数、つまり数値として送信されます。それが処理の後にRに返されるとき、それはまだ数だけです。

は、これを処理するには、いくつかの方法があります。

1)列名がそれが元々持っていたとしてPOSIXct同じ名前になることです出力列の名前を付けます。 sqldfには、入力と出力の列名を調べるヒューリスティックがあり、一致するものがあれば、その名前の入力列と同じクラスに出力を変換する必要があるとみなします。

sqldf("select min(u.created_on) as created_on from user u") 
##   created_on 
## 1 2017-02-15 19:39:10 

2)メソッドの引数明示的method引数を使用して割り当てるどのクラスsqldf言う:

sqldf("select min(u.created_on) as min_date__POISXt from user u", method = "POSIXct") 
##    min_date 
## 1 2017-02-15 19:39:10 

3)H2むしろH2バックエンドを使用し、デフォルトのSQLiteのバックエンドを使用するよりも。 H2 はdatetimeクラスをサポートしているので、期待どおりに動作します。 H2用のRH2ドライバパッケージをロードすると、sqldfはそれを認識してSQLiteの代わりにそのデータベースを使用します。 (またsqldfから"sqldf.driver"オプションとdrv=引数がバックエンドを指定するために使用することができます - ?sqldfとsqldfのgithubのホームページの情報を参照してください。)

library(RH2) 

sqldf("select min(u.created_on) as min_date from user u") 
##    min_date 
## 1 2017-02-15 19:39:10 
0

SQLiteのストア数値として日時のようなオブジェクト、通常epoch seconds、ありがとうございました。これはやむを得ないことです。

あなたが?as.POSIXctを読めば、あなたが表示されます

## S3 method for class 'numeric' 
as.POSIXlt(x, tz = "", origin, ...) 

以降

原産地:日付時刻オブジェクト、またはas.POSIXct(TZによって強要することができます何か= " GMT ")をそのようなオブジェクトに追加します。

as.POSIXct(1380749081, origin="1970-01-01") 
# [1] "2013-10-02 14:24:41 PDT" 
+0

G. Grothendieck氏の答えによると、SQLiteは 'sqldf'のデフォルトのバックエンドですが、唯一のものではありません。私の答えの2番目の部分は、事後の事実だけの賠償であれば、まだ適切です。 – r2evans

関連する問題