13

私は新しいバージョンdata.table、特にAWESOMEfread関数を使用しています。私のファイルには、のように見える文字列としてロードされる日付が含まれています(他の方法でそれを行うかどうかわからないため)01APR2008:09:00:00

これらの日時に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. 後で効率的に並べ替えることができるように、IDateTimeから直接キャストする方法はありますか?fread
  2. そうでない場合は、この日時列でDTを並べ替えることができるようにしたいことを知って、最も効率的な方法は何ですか。
4

2 に答える 2

12

残念ながら(効率のために)strptimePOSIXltタイプが生成されますが、これはサポートされておらずdata.table、常にそのサイズ(1日あたり40バイト!)と構造が原因です。はるかに優れたPOSIXctを生成しますがstrftime、それでもPOSIXltを介して生成します。詳細はこちら:

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

などの基本関数を見るとas.Date、それも使用しstrptimeて、doubleとして格納されているエポックから(奇妙なことに)整数オフセットを作成します。のIDate(およびその仲間の)クラスはdata.table、整数として格納された整数エポックオフセットを実現することを目的としています。による高速ソートに適していますbase::sort.list(method = "radix")(これは実際にはカウントソートです)。IDate(通常は1回限りの)変換を高速化することを実際には目指していません。

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

文字列の日付が次のようになっている場合は"2012-12-24"、整数の日付as.integer(gsub("-", "", col))に進みます。YYYYMMDD同様に、時間はHHMMDD整数にすることができます。2つの列:dateおよび個別に、通常は1日以内にしたいが、前日にはしtimeたくない場合に役立ちます。roll = TRUE月ごとのグループ化は簡単で高速ですby = date %/% 100L。日の加算と減算は面倒ですが、平日や営業日ではなく、暦日を追加することはめったにないため、とにかく問題があります。とにかく、それはあなたの営業日のベクトルへのルックアップです。

あなたの場合、文字月はに変換する必要があり1:12ます。日付「01APR2008」には区切り文字がないため、substring一方向の後に月の名前にmatchまたはが続きます。fmatchファイル形式を管理していますか?その場合、数値は、、、などの自然にソートされる明確な形式の方が適してい%Y-%m-%dます%Y%m%d

でこれを行う最善の方法がまだわかっていないfreadため、日付の形式や出力するタイプを検出する方法がまだわからないため、現在、日付/時刻は文字のままになっています。ただし、非効率的な文字ではなく、整数または二重の日付を出力する必要があります。私のYYYYMMDD整数の使用は型にはまらないと思われるので、それをデフォルトにするのは少しためらいがあります。それらには場所があり、エポックベースの日付の長所と短所もあります。日付は常にエポックベースである必要はありません。私が提案しているのはそれだけです。

どう思いますか?ところで、励ましに感謝しfreadます; 見て良かったです。

于 2012-12-28T00:27:34.700 に答える
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つの変換を実行しますが、データを読み取るときに実行し、2番目の変換はフォーマットの問題を処理せずに実行します。

于 2012-12-28T03:19:58.517 に答える