2016-05-14 7 views
0

DFという名前のデータ・フレームに、時刻と日付の列があります。これらの列の値に基づいてDFをサブセット化したいと思います。日付については、DATESに日付のリストがあり、DF $日付がDATESにあるDF行をサブセット化しています。当分の間、私は00:04:00から00:06:00にサブセットを作りたいと思います。後者のやり方はわかりません。タイム・シーケンスに基づいてデータ・フレームをサブセット化する

理想的には、00:04:00から00:06:00のように範囲を指定することと、00:04のように先読みする開始点と分を指定することによって、両方をサブセット化したいと考えています。 00および3分(2つの異なる方法)。私はすべてが時間のシーケンスを作ることになり、そのようなシーケンスを別のベクトルに置くことになると思っています。

これは簡単に再現可能な例です。私はこれを行う一般的な方法を模索しています。なぜなら、実際には大きな時間の部分集合にしたいからです。この例では一致する日付は1つしかありませんが、実際には複数の日付にまたがる一致する日付が多数存在することにも注意してください。だから、私はそれが時間シーケンスを作るためにPOSIXltを使用することはできないと信じている理由です。どうもありがとうございました。

#DF looks like this: 
    #    DateTime XXX  Time  Date 
    #1371 2016-04-25 00:08:00 14 00:08:00 2016-04-25 
    #1372 2016-04-25 00:07:00 13 00:07:00 2016-04-25 
    #1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
    #1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
    #1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 
    #1376 2016-04-25 00:03:00 4 00:03:00 2016-04-25 
    #1377 2016-04-25 00:02:00 6 00:02:00 2016-04-25 
    #1387 2016-04-24 23:52:00 41 23:52:00 2016-04-24 
    #1388 2016-04-24 23:51:00 93 23:51:00 2016-04-24 
    #1389 2016-04-24 23:50:00 53 23:50:00 2016-04-24 

    #Code for DF, DATES, and to subset DF based on DATES 
    DF <- structure(list(DateTime = structure(list(sec = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), min = c(8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L, 59L, 58L, 57L, 56L, 55L, 54L, 53L, 52L, 51L, 50L), hour = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L), mday = c(25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L), mon = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), year = c(116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L, 116L), wday = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), yday = c(115L, 115L, 115L, 115L, 115L, 115L, 115L, 115L, 115L, 114L, 114L, 114L, 114L, 114L, 114L, 114L, 114L, 114L, 114L), isdst = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), zone = c("EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT", "EDT"), gmtoff = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_)), .Names = c("sec", "min", "hour", "mday", "mon", "year", "wday", "yday", "isdst", "zone", "gmtoff"), class = c("POSIXlt", "POSIXt")), Open = c(14, 13, 14, 3, 2, 4, 6, 4, 15, 15, 23, 24, 33, 14, 65, 54, 41, 93, 53), Time = c("00:08:00", "00:07:00", "00:06:00", "00:05:00", "00:04:00", "00:03:00", "00:02:00", "00:01:00", "00:00:00", "23:59:00", "23:58:00", "23:57:00", "23:56:00", "23:55:00", "23:54:00", "23:53:00", "23:52:00", "23:51:00", "23:50:00"), Date = structure(c(16916, 16916, 16916, 16916, 16916, 16916, 16916, 16916, 16916, 16915, 16915, 16915, 16915, 16915, 16915, 16915, 16915, 16915, 16915), class = "Date")), .Names = c("DateTime", "XXX", "Time", "Date"), row.names = c("1371", "1372", "1373", "1374", "1375", "1376", "1377", "1378", "1379", "1380", "1381", "1382", "1383", "1384", "1385", "1386", "1387", "1388", "1389"), class = "data.frame") 
    DATES <- structure(c(12431, 12432, 10445, 10480, 11487, 12494, 12501, 12508, 13115, 13522, 14529, 15536, 16916, 16935), class = "Date") 
    SELEC <- DF[DF$Date %in% DATES,] 

    #Result of subsetting by Date: 
    #     DateTime XXX  Time  Date 
    # 1371 2016-04-25 00:08:00 14 00:08:00 2016-04-25 
    # 1372 2016-04-25 00:07:00 13 00:07:00 2016-04-25 
    # 1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
    # 1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
    # 1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 
    # 1376 2016-04-25 00:03:00 4 00:03:00 2016-04-25 
    # 1377 2016-04-25 00:02:00 6 00:02:00 2016-04-25 
    # 1378 2016-04-25 00:01:00 4 00:01:00 2016-04-25 
    # 1379 2016-04-25 00:00:00 15 00:00:00 2016-04-25 

    #How the final product would look like if using a larger data base spanning many years: 
    #   DateTime XXX  Time  Date 
    #2016-04-25 00:06:00 13 00:06:00 2016-04-25 
    #2016-04-25 00:05:00 14 00:05:00 2016-04-25 
    #2016-04-25 00:04:00 3 00:04:00 2016-04-25 
    #2014-03-11 00:06:00 94 00:06:00 2014-03-11 
    #2014-03-11 00:05:00 6 00:05:00 2014-03-11 
    #2014-03-11 00:04:00 14 00:04:00 2014-03-11 
    #2011-08-06 00:06:00 13 00:06:00 2011-08-06 
    #2011-08-06 00:05:00 19 00:05:00 2011-08-06 
    #2011-08-06 00:04:00 41 00:04:00 2011-08-06 

答えて

0

可能性1:辞書式比較

すべての時間値は、例えば%H:%M:%S同じデリミタゼロパディング24時間文字列として格納されている場合、フィルタを適用するために辞書編集の比較を用いることができる。それらは

より良い解決策は変換関与など、除算、加算、減算、乗算のように、時間ベースの数学に向いていないため

DF[DF$Date%in%DATES & DF$Time>='00:04:00' & DF$Time<='00:06:00',]; 
##     DateTime XXX  Time  Date 
## 1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
## 1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
## 1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 

辞書式ソリューションは、もちろん、理想的ではありません時間値を、明示的または不特定の基準時間からのオフセットとして符号化する数値タイプに変換する。イッツ・マニュアル数値

:これはどのように人気の日付/時刻のライブラリは、C++、Java用Joda-Time、およびPOSIXct、difftimeためboost date_timeなどの型を、エンコード、およびR.

ためlubridate

可能性2であります時間帯を表す数値を構築するために文字列を自分自身で解析し、数値比較を使用してフィルタを適用することが可能です。

hmsToDouble <- function(hms) as.double(substr(hms,1,2))*3600 + as.double(substr(hms,4,5))*60 + as.double(substr(hms,7,8)); 
DF[DF$Date%in%DATES & hmsToDouble(DF$Time)>=hmsToDouble('00:04:00') & hmsToDouble(DF$Time)<=hmsToDouble('00:06:00'),]; 
##     DateTime XXX  Time  Date 
## 1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
## 1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
## 1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 

可能性3:POSIXt

我々はPOSIXt(すなわち、POSIXct又はPOSIXlt)の値のベクトルを生成し、これらのベクトルに対してベクトルの比較を使用することができます。

DF[DF$Date%in%DATES & DF$DateTime>=as.POSIXct(paste0(DF$Date,' 00:04:00')) & DF$DateTime<=as.POSIXct(paste0(DF$Date,' 00:06:00')),]; 
##     DateTime XXX  Time  Date 
## 1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
## 1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
## 1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 

可能性4:ザのみ内蔵持続時間データタイプRにdifftime

はで動作するように少し細心の注意であることができるdifftimeタイプ、です。しかし、この問題のために、それはかなり簡単です。

DF[DF$Date%in%DATES & as.difftime(DF$Time)>=as.difftime('00:04:00') & as.difftime(DF$Time)<=as.difftime('00:06:00'),]; 
##     DateTime XXX  Time  Date 
## 1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
## 1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
## 1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 

可能性5:lubridateパッケージが広くR.の取り扱い日付/時刻のための最高のパッケージであると考えられてlubridate

それは通常の時間を表し期間の種類を提供し、様々な不規則な時間単位のカウントを表すことができる周期タイプである。歴史的に、日付/時刻ライブラリは、不規則な期間と定期的な期間との区別に感謝しなかったため、時々失敗しました。

次の解決策では、hms()呼び出しでピリオドタイプのインスタンスが返されるため、実際には別のタイムユニットを比較しています。ちなみに、別々の時間単位の実際の記憶に関して、lubridateの設計は、二重ベクトルの実際のペイロードとして秒の値を格納し、残りの単位(分、時間、日、月、年)をオブジェクト。

library(lubridate); 
DF[DF$Date%in%DATES & hms(DF$Time)>=hms('00:04:00') & hms(DF$Time)<=hms('00:06:00'),]; 
##     DateTime XXX  Time  Date 
## 1373 2016-04-25 00:06:00 14 00:06:00 2016-04-25 
## 1374 2016-04-25 00:05:00 3 00:05:00 2016-04-25 
## 1375 2016-04-25 00:04:00 2 00:04:00 2016-04-25 
0

これはいかがですか?

与える
DF$Time <- strptime(DF$Time,format = '%H:%M:%S') 

timeCondition <- (DF$Time >= strptime('00:04:00',format = '%H:%M:%S')) & (DF$Time <= strptime('00:06:00',format = '%H:%M:%S')) 

SELEC <- DF[timeCondition & DF$Date %in% DATES,] 

   DateTime XXX    Time  Date 
1373 2016-04-25 00:06:00 14 2016-05-14 00:06:00 2016-04-25 
1374 2016-04-25 00:05:00 3 2016-05-14 00:05:00 2016-04-25 
1375 2016-04-25 00:04:00 2 2016-05-14 00:04:00 2016-04-25 
関連する問題