私は次の形式の日付を持っていますdd-mm-yyyy HH:mm:ss
この日付を検証するための最良かつ最も簡単な方法は何ですか?
私は試した
d <- format.Date(date, format="%d-%m-%Y %H:%M:%S")
しかし、違法な日付が過ぎたときにエラーをキャッチするにはどうすればよいですか?
私は次の形式の日付を持っていますdd-mm-yyyy HH:mm:ss
この日付を検証するための最良かつ最も簡単な方法は何ですか?
私は試した
d <- format.Date(date, format="%d-%m-%Y %H:%M:%S")
しかし、違法な日付が過ぎたときにエラーをキャッチするにはどうすればよいですか?
簡単な方法:
d <- try(as.Date(date, format="%d-%m-%Y %H:%M:%S"))
if("try-error" %in% class(d) || is.na(d)) {
print("That wasn't correct!")
}
説明: クラスのオブジェクトに変換するために内部的にformat.Date
使用します。ただし、フォーマット オプションを使用しないため、デフォルトのフォーマットである と が使用されます。as.Date
date
Date
as.Date
%Y-%m-%d
%Y/%m/%d
format
オプション fromはformat.Date
出力のみに使用され、解析には使用されません。as.Date
マニュアルページから引用:
'as.Date' メソッドは、文字列、因数、論理 'NA'、およびクラス '"POSIXlt"' および '"POSIXct"' のオブジェクトを受け入れます。(最後は、指定されたタイムゾーン (デフォルト UTC) での時間の表現で真夜中以降の時間を無視することによって、日数に変換されます。) また、クラス '"date"' (パッケージ 'date' から) および '"dates" のオブジェクト' (パッケージ 'chron' から)。文字列は、指定された形式で必要な限り処理されます。末尾の文字は無視されます。
ただし、フォーマット指定で直接呼び出す場合as.Date
は、フォーマットに適合するもの以外は許可されません。
も参照してください。?as.Date
gsubfn
パッケージを見るといいかもしれません。これには(gsubfn
特に)他の正規表現関数と同様に機能してピースを文字列に一致させる関数がありますが、ユーザー提供の関数を呼び出して、一致するピースをこの関数に渡します。したがって、年、月、日を調べて、それらが正しい範囲内にあることを確認する独自の関数を作成します (また、日の範囲は、渡された月と年によって異なる場合があります。
あなたが探しているのはtryCatch関数だと思います。以下は、共通の x 軸を持つ 2 つのシリーズを含む任意の .csv ファイルを受け入れる、私が作成したスクリプトからの抜粋です。「データ」の最初の列は共通の x 軸変数で、列 2 と 3 は y 軸変数です。x 軸のデータが時系列であるか、他のタイプの変数であるかに関係なく、スクリプトがプロットを作成することを確認するには、tryCatch ステートメントが必要でした。
### READ DATA FROM A CSV FILE
data = read.csv("STLDvsNEM2.csv", header = TRUE)
#CONVERT FIRST ROW OF DATA (IN MY CASE, THE COLUMN INTENDED TO BE THE X AXIS)
#TO AN ACCEPTABLE DATE FORMAT
#IF FIRST ROW OF DATA IS NOT IN AN ACCEPTABLE DATE FORMAT
#USE THE VALUE WITHOUT ANY TRANSFORMATION
x <- tryCatch({
as.Date(data[,1])},
warning = function(w) {},
error = function(e) {
x <- data[,1]
})
y1 <- data[,2]
y2 <- data[,3]
ここでの多くのソリューションは、SQL インジェクションの傾向があります。彼らはTRUE
のために戻りdate = "2020-08-11; DROP * FROM my_table"
ます。で動作するベクトル化された基本 R 関数を次に示しますNA
。
is_date = function(x, format = NULL) {
formatted = try(as.Date(x, format), silent = TRUE)
is_date = as.character(formatted) == x & !is.na(formatted) # valid and identical to input
is_date[is.na(x)] = NA # Insert NA for NA in x
return(is_date)
}
やってみよう:
> is_date(c("2020-08-11", "2020-13-32", "2020-08-11; DROP * FROM table", NA), format = "%Y-%m-%d")
## TRUE FALSE FALSE NA