3

私はこのように言うことができる文字列を持っています

Ankit : 2013 年 5 月 13 日午前 10 時 55 分

そして、私はそれから日付を取得したい

2013 年 5 月 13 日

Rでこれを行う方法はありますか? 次の方法で strptime 関数を試しました。

strptime("Ankit says: May 13, 2013 at 10:55 am you rock", " %b %d, %Y")

私は得る"NA"

でもデートの前に何も言わずにやってみると

strptime("May 13, 2013 at 10:55 am you rock", " %b %d, %Y")

次のように出力されます"2013-05-13"

私も次のような正規表現を試しました

grep("Ankit says: May 13, 2013 at 10:55 am you rock", "?(?:[a-zA-Z]*)(\\s+)(?:[0-9]*)(,)(\\s+)(?:[0-9]*)")
4

3 に答える 3

5

これはgsubfn パッケージstrapplyから使用します。正規表現を各文字列に一致させ、正規表現の括弧で囲まれた部分に一致する部分文字列を個別の引数として渡し、最後にその関数の出力を組み立てます。各インスタンスに同じ日付と時刻の形式が存在すると想定しましたが、周囲のテキストについてはあまり想定していません。patto.POSIXct

library(gsubfn)
s <- c("Ankit says: May 13, 2013 at 10:55 am you rock", 
            "The date is Jun 6, 2013 and the time is 11:18 pm")

pat <- "(\\w+ \\d{1,2}, \\d{4}).*(\\d{2}:\\d{2} [ap]m)"
to.POSIXct <- function(d, t) as.POSIXct(paste(d, t), format = "%b %d, %Y %I:%M %p")
strapply(s, pat, to.POSIXct, simplify = "c")

を与える

[1] "2013-05-13 10:55:00 EDT" "2013-06-06 23:18:00 EDT"

更新: 訂正

于 2013-06-07T15:32:48.550 に答える
3

あなたが試したことを示してくれてありがとう。すべての日時が同じ形式であると仮定すると、これを使用できます。

s <- "Ankit says: May 13, 2013 at 10:55 am you rock"
month.abb.pattern <- paste(month.abb,collapse="|")
datetime.fmt <- "%b %d, %Y at %I:%M %p"
strptime(substr(s, regexpr(month.abb.pattern, s), nchar(s)), datetime.fmt)
于 2013-06-07T15:12:37.573 に答える
1

2 回目の試行で、正しい道を進んでいます。次の引数を使用strsplitして、日付より前のすべてを削除します。splitsays:

strptime(strsplit("Ankit says: May 13, 2013 at 10:55 am you rock","says: ")[[1]][2],
         format= "%b %d, %Y")
[1] "2013-05-13"

それを多くのログエントリに自動化したい場合:

strptime(do.call(rbind,strsplit(your_log_as_a_vector, "says: "))[,2],
         format = "%b %d, %Y")

編集:実際、文字列に後で含めることができるという問題がありますsays:。次に、次のようにします (秒があっても、says常に日付の後に表示されるため、日付を含むチャンクは常に 2 番目になります)。

 strptime(sapply(strsplit(your_log_as_a_vector, "says: "),`[`,2),
         format = "%b %d, %Y")
于 2013-06-07T15:16:03.933 に答える