8

Teradata からエクスポートされた .csv データを使用しています。いくつかの列はもともとタイムゾーン付きのタイムスタンプだったので、.csv を R にロードした後、これらの列 (文字列としてロードされたもの) を POSIXlt または POSIXct に変換したいと思います。を使用していますが、.csv ファイルからのタイムゾーンの形式が予期したstrptimeものと一致しません。strptimeたとえば、期待どおりです-0400が、.csv の形式-04:00はコロンで時間と分が区切られています。

コロンを削除することはできますが、これは余分な手順であり、できれば避けたい合併症です。strptimeタイムゾーン ( ) に別の形式を使用するように指示する方法はあり%zますか?

次に例を示します。

## Example data:
x <- c("2011-10-12 22:17:13.860746-04:00", "2011-10-12 22:17:13.860746+00:00")
format <- "%Y-%m-%d %H:%M:%OS%z"

## Doesn't work:
strptime(x,format)
## [1] NA NA

## Ignores the timezone:
as.POSIXct(x)
## [1] "2011-10-12 22:17:13 EDT" "2011-10-12 22:17:13 EDT"

## Remove the last colon:
x2 <- gsub("(.*):", "\\1", x)
x2
## [1] "2011-10-12 22:17:13.860746-0400" "2011-10-12 22:17:13.860746+0000"

## This works, but requires extra processing (removing the colon)
strptime(x2,format)
## [1] "2011-10-12 22:17:13" "2011-10-12 18:17:13"

だから私は、フォーマットを認識するタイムゾーンのカスタム式である のstrptime(x,"%Y-%m-%d %H:%M:%OS%zz")ようなものを使用して、この最後の結果を達成しようとしています。またはさらに良いかもしれません。%zz-04:00%zH:%zM

これが不可能な場合、(さまざまな形式の) 文字列を data.frame/data.table の複数の列の日付に変換するための洗練された柔軟な関数を誰かが持っていますか?

4

2 に答える 2

6

lubridateこの形式を処理できることがわかりました。

library(lubridate)
ymd_hms(x)
## [1] "2011-10-13 02:17:13 UTC" "2011-10-12 22:17:13 UTC"

または、ローカル タイムゾーンで表示するには:

with_tz(ymd_hms(x))
## [1] "2011-10-12 22:17:13 EDT" "2011-10-12 18:17:13 EDT"

柔軟性を高めるには (引き続き を使用lubridate):

parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z")

高速化の場合 (lubridateオプションの中で):

lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO")

タイミング:

microbenchmark(
  ymd_hms(x),
  parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z"),
  lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO"),
  strptime(gsub("(.*):", "\\1", x), format)
)

## Unit: microseconds
##                                               expr      min       lq       mean    median        uq      max neval
##                                         ymd_hms(x) 1523.819 1578.495 1715.14577 1629.5385 1744.3695 2850.393   100
##         parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z") 1108.676 1150.633 1273.77301 1190.3315 1264.8050 5947.204   100
##  lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO")   89.838  103.390  112.45338  107.8425  115.2265  216.512   100
##        strptime(gsub("(.*):", "\\\\1", x), format)   46.716   58.294   71.90934   69.9415   86.5860  105.044   100
于 2016-08-14T04:57:35.993 に答える
2

同じことを達成しようとして、この質問に出くわしました。

あなたが言及したように、それを修正するために私が見つけた唯一のことは、正規表現を使用してコロンを削除することです。置換で間違いを避けるために、正規表現を少し締めることができます。

x2 <- gsub('^([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]+[+-][0-9]{2}):([0-9]{2})$',
           '\\1\\2',
           x)
# [1] "2011-10-12 22:17:13.860746-0400" "2011-10-12 22:17:13.860746+0000"
于 2013-04-09T01:55:02.383 に答える