7

私は日付の文字表現のベクトルを持っています。フォーマットは主にdmY(27-09-2013 など)、dmy(27-09-13 など)、時にはいくつかbまたはB月です。したがって、「ユーザーが異種の日時文字表現を処理するために複数のフォーマット順序を指定できるようにする」parse_date_timeパッケージでは、私にとって非常に便利な機能になる可能性があります。lubridate

ただし、日付と一緒に発生すると、日付のparse_date_time解析に問題があるようです。単独で解析する場合、または私に関連する他の形式と一緒に解析する場合、問題なく動作します。このパターンは、@Peyton の回答hereへのコメントにも記載されています。早急な対応を提案されましたが、対応可能かお聞きしたいです。dmydmYdmydmylubridate

dmyここでは、他の形式と一緒に形式で日付を解析し、ordersそれに応じて指定する例をいくつか示します。

library(lubridate)
# version: lubridate_1.3.0

# regarding how date format is specified in 'orders':
# examples in ?parse_date_time
# parse_date_time(x, "ymd")
# parse_date_time(x, "%y%m%d")
# parse_date_time(x, "%y %m %d")
# these order strings are equivalent and parses the same way
# "Formatting orders might include arbitrary separators. These are discarded"

# dmy date only
parse_date_time(x = "27-09-13", orders = "d m y")
# [1] "2013-09-27 UTC"
# OK

# dmy & dBY
parse_date_time(c("27-09-13", "27 September 2013"), orders = c("d m y", "d B Y"))
# [1] "2013-09-27 UTC" "2013-09-27 UTC"
# OK

# dmy & dbY
parse_date_time(c("27-09-13", "27 Sep 2013"), orders = c("d m y", "d b Y"))
# [1] "2013-09-27 UTC" "2013-09-27 UTC"
# OK

# dmy & dmY
parse_date_time(c("27-09-13", "27-09-2013"), orders = c("d m y", "d m Y"))
# [1] "0013-09-27 UTC" "2013-09-27 UTC"
# not OK

# does order of the date components matter?
parse_date_time(c("2013-09-27", "13-09-13"), orders = c("Y m d", "y m d"))
# [1] "2013-09-27 UTC" "0013-09-27 UTC"
# no

select_formats議論はどうですか?申し訳ありませんが、ヘルプ ファイルのこのセクションを理解するのに苦労しています。そしてon SO : 0 の結果を検索します。select_formatsそれでも、このセクションは関連しているように見えました:「デフォルトでは、ほとんどのフォーマットトークン (%) を持つフォーマットが選択され、%Y は 2.5 トークンとしてカウントされます (したがって、%y%m よりも優先されます)。」. dmyだから私は(必死に)いくつかの追加の日付を試しました:

parse_date_time(c("27-09-2013", rep("27-09-13", 10)), orders = c("d m y", "d m Y"))
# not OK. Tried also 100 dmy dates.

# does order in the vector matter?
parse_date_time(c(rep("27-09-13", 10), "27-09-2013"), orders = c("d m y", "d m Y"))
# no

次に、guess_formats関数 ( もlubridate) がどのように処理dmyされるかを確認しましたdmY

guess_formats(c("27-09-13", "27-09-2013"), c("dmy", "dmY"), print_matches = TRUE)
#                   dmy        dmY       
# [1,] "27-09-13"   "%d-%m-%y" ""        
# [2,] "27-09-2013" "%d-%m-%Y" "%d-%m-%Y"
# OK   

から?guess_formats: y also matches Y。から?parse_date_time: y* Year without century (00–99 or 0–99). Also matches year with century (Y format)。だから私は試しました:

guess_formats(c("27-09-13", "27-09-2013"), c("dmy"), print_matches = TRUE)
#                   dmy       
# [1,] "27-09-13"   "%d-%m-%y"
# [2,] "27-09-2013" "%d-%m-%Y"
# OK

したがって、と一緒guess_formatに対処できそうです。しかし、どうすれば同じことをするように言うことができますか? コメントやヘルプをお寄せいただきありがとうございます。dmydmYparse_date_time

更新lubridateバグレポート に質問を投稿したところ、@vitoshka から「これはバグです」という迅速な返信がありました。

4

2 に答える 2

1

これは実際には意図的なものです。今思い出しました。同じベクトルに 01-02-1845 と 01-02-03 の形式の日付がある場合、意味するのはおそらく 01-02-0003 であると想定されます。また、異なる世紀の日付との混同を避けることもできます。17-05-1320 世紀か 21 世紀かはわかりません。

この決定には技術的な理由もあったかもしれませんが、今は覚えていません。

.select_formats引数は行く方法です:

my_select <-   function(trained){
  n_fmts <- nchar(gsub("[^%]", "", names(trained))) +
    grepl("%y", names(trained))*1.5
  names(trained[ which.max(n_fmts) ])
}

parse_date_time(c("27-09-13", "27-09-2013"), "dmy", select_formats = my_select)
## [1] "2013-09-27 UTC" "2013-09-27 UTC"

select_formats入力文字ベクトルに順次適用される形式を返す必要があります。上記の例では、%y 形式を優先しています。

この例をドキュメントに追加しています。

于 2013-10-02T20:59:49.310 に答える