2016-08-31 5 views
1

sqldfを使用して日付に追加しようとしていますが、それは単純なはずですが、私の日付形式が間違っていることはわかりません。使い方:R:sqldfの日付関数が異常な応答を返す(日付形式が間違っています)

sqldf("select date(model_date, '+1 day') from lapse_test") 

ギブさんの答えをLIKE「-4666-01-23」

model_dateさんは、日付形式で、私は以前の文字からそれらを作った2015年1月1日

のように見えます文字列('12/1/2015 ')を使用して

lapse_test$model_date <- as.Date(lapse_test$date1,format = "%m/%d/%Y") or 
lapse_test$model_date <- as.POSIXCT(lapse_test$date1,format = "%m/%d/%Y") 

私はこれが問題だと思いますか?何か案は? date()関数に文字変数を渡す

+0

日付メソッドを指定すると、日付を入力するSQL Unserstandを作成できます。 'sqldf( 'df'からa__Dateとしてaを選択する、method =" name__class ") ' –

+1

sqliteには日付型がありません。日付関数はありません。代わりにH2バックエンドでsqldfを使用してください(H2には日付型があります)。詳細については、sqldfとsqldfのホームページを参照してください。https://github.com/ggrothendieck/sqldf –

答えて

2

は動作するようです:あなたはSQLを必要とせずに、直接、RでのDateオブジェクト上の(一部)算術演算を行うことができます

df <- data.frame(a=as.Date("2010-10-01")) 
df$b <- as.character(df$a) 

sqldf("select date(a) from df") 
#  date(a) 
# 1 -4672-08-24 

sqldf("select date(b) from df") 
#  date(b) 
# 1 2010-10-01 

sqldf("select date(b, '+1 day') from df") 
# date(b, '+1 day') 
# 1  2010-10-02 

注:

df$a <- df$a + 1 
df 
#   a   b 
# 1 2010-10-02 2010-10-01 
1

SQLiteの日付関数は日付を、11月24日(4714BC)からの日数と見なします。つまり、2015-12-01の例の日付の整数記憶域が16770であるということは、4667BCのどこかに古代の日付を返します。

1970-01-01のR原点とSQLiteの原点との差が2440588日であることがわかります。あなたがしたい場合、どの意味し、あなたのアカウントにこの定数を取ることができます。HongOoiの答え@

test <- data.frame(model_date=as.Date("12/1/2015",format="%m/%d/%Y")) 
sqldf("select date(model_date + 2440588, '+1 day') as select_date from test") 
# select_date 
#1 2015-12-02 

は、おそらくより良いですが、私は、これは根本的な仕組みを知っているのは興味深いかもしれないと思いました。

+0

本当に役に立ちます。時間を割いて説明していただき、ありがとうございます。 – khhc

関連する問題