2012-12-27 15 views
12

私はdata.tableの新しいバージョン、特にAWESOME freadの機能を使用しています。私のファイルには、文字列としてロードされた日付が含まれています(そうでないとわからないため)01APR2008:09:00:00のように見えます。IDateTimeに直接文字列をキャスト

これらのdatetimesでdata.tableをソートしてから、IDateTimeの形式(またはそれ以外のものはまだわかりません)で効率よく並べ替える必要があります。

> strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S") 
[1] "2008-04-01 09:00:00" 

> IDateTime(strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")) 
     idate itime 
1: 2008-04-01 09:00:00 

> IDateTime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S") 
Error in charToDate(x) : 
character string is not in a standard unambiguous format 

DT[ , newType := IDateTime(strptime(oldType, "%d%b%Y:%H:%M:%S"))]のように見えます。

私の質問は、以下のとおりです。

  1. は、私が効率的にその後ソートできるようfreadからIDateTimeに直接キャストする方法は、ありますか?私は
+0

あなたのデータファイルをどのように見せることができますか? – agstudy

+0

こんにちは、このファイルは 'sep ="; "'と書かれた '' 01APR2008:09:00:00 "'のような形式のcsvファイルです '%d%b%Y:%H: %M:%S "'。私がしたのは 'DT [、date:= IDate(oldType、"%d%b%Y ")]; DT [、time:= ITime(oldType、"%d%b%Y:%H:%M :%S ")]'最後に 'setkeyv(DT、c(" date "、" time "))' – statquant

+0

あなたのデータの最初の列は? – agstudy

答えて

11

残念ながら、この日時欄でDTを並べ替えできるようにしたいことを知って行くための最も効率的な方法は何か

  • ない場合は、(効率のために)strptimeはによってサポートされていないPOSIXltタイプを生成しますdata.tableであり、常にそのサイズ(日付ごとに40バイト!)と構造になります。 strftimeがはるかに優れたPOSIXctを生成しますが、それでもPOSIXltを介して行います。詳細:なas.Dateなど基本機能に探し

    http://stackoverflow.com/a/12788992/403310 
    

    、それがdoubleとして保存されたエポックからのオフセットの整数を(奇妙な)の作成、あまりにstrptimeを使用しています。 data.tableIDate(およびフレンド)クラスは、整数のエポックオフセットを整数として格納することを目的としています。 base::sort.list(method = "radix")による高速ソートに適しています(これは実際にはカウントソートです)。 IDateは実際に(通常は1つの)変換が高速であることを目指していません。

    文字列の日付/時刻を正しく、間違って変換するために、私は自分のヘルパー関数をロールバックする傾向があります。

    文字列の日付が"2012-12-24"の場合は、as.integer(gsub("-", "", col))に向かって傾き、YYYYMMDD整数の日付に進みます。同様に、時刻はHHMMDDになります。 2つの列:datetimeは、一般的に1日にroll = TRUEにする必要がある場合に便利ですが、前日には使用できません。月単位でグループ化するのはシンプルで高速です:by = date %/% 100L。日の追加と減算は面倒ですが、曜日や平日ではなく、営業日を追加することはほとんどありません。とにかくそれはあなたのビジネスの日のベクトルへのルックアップです。

    あなたの場合、文字の月は1:12に変換する必要があります。あなたの日付 "01APR2008"には区切り記号がありませんので、substringは片道になり、月名にmatchまたはfmatchが続きます。あなたはファイル形式を管理していますか?そうであれば、数字は%Y-%m-%d、または%Y%m%dのように自然に並べ替える明瞭な形式で優れています。

    私はまだfreadでどのように最善を尽くすようになっていないのですか。日付のフォーマットや出力するタイプを検出する方法がまだわからないため、日付/時刻は現在文字として残っています。非効率な文字ではなく、整数または倍精度のどちらかの日付を出力する必要があります。私はYYYYMMDD整数の私の使用が非典型的であると思われるので、私はそれをデフォルトにすることを少し躊躇しています。彼らは彼らの場所を持っており、エポックベースの日付の長所と短所もあります。日付はにはありません。いつもエポックベースであると私は示唆しているすべてです。

    あなたはどう思いますか? Btw、奨励のおかげでfread;見てうれしいです。

  • +0

    ちょっとマシューは答えてくれてありがとう、私はread.csvのようにcolClassesの引数を許可すると思います。結局のところ、あなたは自分の書式を指定することができます(別の投稿から取った例文) 'R)setAs(" character "、" myDate "、function(from)as.Date(from、format ="%d/";" string "=" TRUE "、colClasses = c(" factor "、" factor "、"%m /%y "))" 'R)system.time(data < - read.csv(file = filePath、sep ="; "、stringsAsFactors = TRUE、 、 "数値"、 "myDate")、nrows = 10)); ' – statquant

    +0

    さらに、パッケージにマイクロ秒の解決時間を追加することができれば、より多くの人に触れると思います。すべてのHFTraders/quantsはこのようなもので遊んでいます...(間違いなく、Rをこれに使うべきではありませんが、そこに行こうとはしません) – statquant

    +0

    合意した 'colClasses'は既に追加するリストにあります.c)が、特定の列をすべて指定する必要はなく、指定した列を上書きできる名前付きベクトルとして使用します。それは本当にデフォルトに関するより多くの質問だった。私は 'POSIXct'を想定しています。これはマイクロ秒をサポートしているので、特別な 'data.table'が本当にサポートする必要があるとは思えません。私がfreadをしたい主な理由は、しかし、ゲノミクスなどの二重区切りファイル(sep2)でした。 –

    1

    あなたのファイルがどのように構造化されているか分かりますが、あなたのコメントから、日付フィールドをキーとして使いたいと思います。なぜそれを時系列として読んで読んでいるときにフォーマットしないのですか?ここで

    は、私はそれを行うために動物園を使用しています。(ここで私は、日付列が最初のものであるとし、それ以外の場合はindex.colum引数を参照してください)あなたがあなたの日付が正しい形式でソートし、ソートします

    ff <- function(x) as.POSIXct(strptime(x,"%d%b%Y:%H:%M:%S")) 
    
    h <- read.zoo(text = "03avril2008:09:00:00 125 
             02avril2008:09:30:00 126 
             05avril2008:09:10:00 127 
             04avril2008:09:20:00 128 
             01avril2008:09:00:00 128" 
             ,FUN=ff) 
    

    変換がPOSIXctからIDateTime

    ここ
    IDateTime(index(h)) 
         idate itime 
    1: 2008-04-01 09:00:00 
    2: 2008-04-02 09:30:00 
    3: 2008-04-03 09:00:00 
    4: 2008-04-04 09:20:00 
    5: 2008-04-05 09:10:00 
    

    あなたはまだ2つの変換を行うのが自然である、しかし、データを読み込むとき、あなたはそれを行うと、あなたが任意の形式の問題に対処することなく、それを行う秒。

    関連する問題