2016-07-14 30 views
3

私はデータセットを持っています。 StataファイルまたはSPSSファイルからRにロードすることを選択できます。
どちらの場合も、havenパッケージが正しくロードされています。 日付は正しく認識されます。R:data.table。 fwriteで日付を正しく保存するには?

しかし、私はdata.tableのfwrite関数でディスクに保存します。
fwrite(ppp, "ppp.csv", sep=",", col.names = TRUE)

問題があり、日付が消えて意味をなさない数字に変換されています。

例えば日付1967年8月6日には、今、私はまた、このような無成功を引用= FALSE、などfwriteのオプションで遊んでみました-879

です。

ファイル、spss、stata、および保存されたcsvの小さなサンプルをアップロードしました。

これはコードであり、簡単にするためです。 library(haven) library(data.table) ppp <- read_sav("pspss.sav") # choose one of these two. ppp <- read_dta("pstata.dta") # choose one of these two. fwrite(ppp, "ppp.csv", sep=",", col.names = TRUE)

実際のテーブル全体には、1000個以上の変数と100万個の個体があります。だから、私は物事をすばやくやりたいのです。

http://www73.zippyshare.com/v/OwzwbyQq/file.html

これは@ArtificialBreezeのためです:

> head(my) 
# A tibble: 6 x 9 
    ID_2006_2011    TIS FECHA_NAC_2006 año2006 Edad_31_12_2006 SEXO_2006 
     <dbl>   <chr>   <date>  <date>   <dbl>  <chr> 
1 1.60701e+11 BBNR670806504015  1967-08-06 2006-12-31    39   M 
2 1.60701e+11 BCBD580954916014  1958-09-14 2006-12-31    48   F 
3 1.60701e+11 BCBL451245916015  1945-12-05 2006-12-31    61   F 
4 1.60701e+11 BCGR610904916012  1961-09-04 2006-12-31    45   M 
5 1.60701e+11 BCMR580148916015  1958-01-08 2006-12-31    48   F 
6 1.60701e+11 BCMX530356917018  1953-03-16 2006-12-31    53   F 
# ... with 3 more variables: PAIS_NAC_2006 <dbl>, FECHA_ALTA_TIS_2006 <date>, 
# FECHA_ALTA_TIS_2006n <date> 
+0

私はなぜdownvoteを知っているかもしれませんか? – skan

+0

あなたの質問にあなたのデータの小さなサブセットを置くことができますか( '' head(yourData) '')?人々がアクセスするのがより簡単で合法になるでしょう。また、日付は文字列として格納されていますか? – FisherDisinformation

+3

おそらく、下垂は、スケッチを見ているzippyshare事のおかげです。参考までに、パッケージはhttps://github.com/Rdatatable/data.table/issues/1772であなたのFRです。「意味をなさない」限り、あなたはそれがあなたにリンク...個人的には、 'patt'パターンを満たすすべての日付カラムを希望のフォーマットの文字列に変換するwrite_dates(DT、patt)関数があります。だから私は 'ライブラリ(magrittr)をする。 fwrite(コピー(DT)%>%write_dates( "date $")、file = "DT.csv") ' – Frank

答えて

7

この質問は6か月前に聞かれたので、fwriteが改善され、CRANにリリースされました。私はそれがあなたが今したいと思うように働くべきだと思う。すなわち、速く、直接的で便利な日付フォーマット。 dateTimeAs引数は次のようになりました.v1.10.0ではfwrite's manual pageからCRANにコピーされました。時間の経過とともに、マニュアルページの最新バージョンを確認してください。

====

dateTimeAs:日付/ IDATE、ITIMEとPOSIXct項目がどのように書かれています。

  • "ISO"(デフォルト)から2016-09-1218:12:162016-09-12T18:12:16.999999Z。 digits.secsなどのRオプションに関係なく、分かりやすい秒数の0、3、または6桁の数字が便宜的に表示されます。ミリとマイクロ秒が存在する場合、それらを保持したいと考えているという考えがあります。 Rの内部UTC表現は、ISO標準を奨励し、タイムゾーンのあいまいさを徹底し、スピードを上げるために忠実に書かれています。オプションは、シェルで "$ TZ = 'UTC' R"を使用してUTCタイムゾーンでRを開始することです(NB:TZ = 'UTC'とRの間に1つ以上のスペースがなければなりません。このTZ設定はRプロンプトにのみ適用されます)、またはSys.setenv(TZ = 'UTC')に設定され、UTCが現地時間であるかのように続行されます。

  • "スカッシュ"から2016091218121620160912181216999。このオプションを使用すると、整数divとmod演算を使用してyyyymmパーツを素早く簡単に抽出することができます。例えば、Rでは、1行のヘルパー関数はそれぞれ%/%10000、%/%100 %% 100、%% 100、%/%100を使用できます。 POSIXct UTCはinteger64(自動的にfread()によって)として快適に読み取られる17桁(常に000の場合でも3桁のミリ秒を含みます)まで押し縮められます。

  • "エポック"から17056655361473703936.999999。関連エポック(1970-01-01、00:00:00および1970-01-01T00:00:00Z)以降の基本的な日数または秒数。それ以前は負であった(Dateを参照)。存在する場合は、0、3、または6桁の分数秒が印刷されます。

  • "write.csv" - これは現在POSIXctにのみ影響します。これはwrite.csvのように、digits.secsに耳を傾け、Rの内部UTC表現をその歴史的日付の現地時間(または "tzone"属性)に変換するas.characterメソッドを使用して記述されます。したがって、これは遅くなる可能性があります。他のすべてのカラムタイプ(日付、IDate、タイムゾーンとは独立したITimeを含む)は、すでにwrite.csvと一貫性のある高速なCコードを使用して "ISO"オプションとして書き出されます。

最初の3つのオプションは、新しい特殊なCコードのため高速です。エポックから日付部分への変換では、3月1日からの開始日を使用してHoward Hinnant(参考文献を参照)の高速アプローチを使用します。これら3つのオプションの間で書き込み速度の違いに気づくべきではありません。日付とIDateでサポートされる日付範囲は[0000-03-01,9999-12-31]です。これらの3,652,365の日付のすべてがテストされ、この範囲の2,790のすべての閏日を含むベースRと比較されます。このオプションは、リスト列セル内の日付/時刻のベクトルにも適用されます。完全に柔軟なフォーマット文字列( "%m /%d /%Y"など)はサポートされていません。これはISO規格の使用を奨励するためであり、その柔軟性はCレベルでの迅速な作成方法がわかっていないためです。必要に応じて、1つまたは2つ以上の特定のオプションをサポートすることができます。

====

+0

[nanotime](https://github.com/eddelbuettel/nanotime)のサポートを追加してください。これは、基になる 'integer64'を保存しても問題ありませんが、再分類が必要です。 –

+1

@DirkEddelbuettelを実行します。 [#1982](https://github.com/Rdatatable/data.table/issues/1982)のおかげで、次のマイルストーンに追加されました。 –

+0

どのように "ISO"をPOSIXctに変換するのですか? (DT $ Time、format = "%Y-%m-%dT%H:%M:%SZ") '? – user3226167

0

私が列クラスを保存し、再びそれらを変更しようとしている簡単な解決策は存在しないようですので。私は、元のデータセットは、pppを​​取る

areDates <- (sapply(ppp, class) == "Date") 

は、私は、ファイルに保存し、私はそれを次の時間を読み取ることができます。

ppp <- fread("ppp.csv", encoding="UTF-8") 

次に、新しく読み込んだデータセットのクラスを元のものに戻します。

ppp[,names(ppp)[areDates] := lapply(.SD,as.Date), 
.SDcols = areDates ] 

多分、誰かがforループとコマンドセットを使ってよりうまく書けます。

ppp[,lapply(.SD, setattr, "class", "Date") , 
.SDcols = areDates] 

また、代わりにTRUEとFALSE

1

のベクトルの位置に書き込むことができ、私は同じ問題を抱えていた、と私は書く前にas.characterする日付の列を変更し、それを変更読んだ後にas.Dateに戻る。私はそれが読み書き時間にどのような影響を与えるかはわかりませんが、それは私にとっては十分な解決策でした。

1

これらの数字にはセンスがあります。fwriteは、データフォーマットを「Matlabコーディング」に変更して、原点が「1970-01-01」になっているようです。 あなたのデータを読めば、あなたは、単にこれらのコードを使用して日付に番号を変更することができます。

as.Date(-879,origin="1970-01-01")

例えば

my$FECHA_NAC_2006<-as.Date(as.numeric(my$FECHA_NAC_2006),origin="1970-01-01")

を[1] "1967年8月6日"

関連する問題