1

以下の文字ベクトルがあります

a = c("2009-07-31 18:00:33", "2009-07-31 18:00:38", "2009-07-31 18:00:43",  "2009-07-31 18:00:49", "2009-08-01 01:58:49", "2009-08-01 01:53:16",  "2009-08-01 08:04:13", "2009-08-01 16:16:13")

これを時間オブジェクトに変換したいので、次のようにします。

b = strptime(a, "%Y-%m-%d %H:%M:%S")

aとbの長さが違うのはなぜですか?

> length(a)
[1] 8
> length(b)
[1] 9
4

3 に答える 3

1

オブジェクトbにはクラスがありPOSIXltます。日付の配列はPOSIXlt、9 つ​​のベクトルの名前付きリストを表すため、常に長さ 9 を返します。

R> class(b)
[1] "POSIXt"  "POSIXlt"

R> unclass(b)
$sec
[1] 33 38 43 49 49 16 13 13
$min
[1]  0  0  0  0 58 53  4 16
$hour
[1] 18 18 18 18  1  1  8 16
$mday
[1] 31 31 31 31  1  1  1  1
$mon
[1] 6 6 6 6 7 7 7 7
$year
[1] 109 109 109 109 109 109 109 109
$wday
[1] 5 5 5 5 6 6 6 6
$yday
[1] 211 211 211 211 212 212 212 212
$isdst
[1] 1 1 1 1 1 1 1 1

ClassPOSIXctは、1970 年の初めからの (符号付き) 秒数を数値ベクトルとして表し、予想される長さを示します。

R> length(as.POSIXct(a))
[1] 8
R> unclass(as.POSIXct(a))
[1] 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09
[8] 1.249e+09
attr(,"tzone")
[1] ""
于 2009-12-11T11:15:18.560 に答える
0

記録として、この FAQ の問題は R 2.11.0 で変更されようとしています。

2.11.0 新機能

length(POSIXlt) は、常に 9 (基になるリスト構造の長さ) ではなく、対応する抽象 timedate-vector の長さを返すようになりました。(PR#14073 と PR#10507 の要望)

これは、Subversion アーカイブの日々の変更をまとめた RSS フィードの 12 月 2 日のエントリ (フィードの詳細については開発者ページ) からのものです。

于 2009-12-11T13:28:53.770 に答える
0

ご覧のとおり、?strptime文字列を class に変換しますPOSIXlt。R には と の 2 種類の時間がPOSIXltありPOSIXctます。説明は に?DateTimeClassesありますが、ショートカットするには:

クラス "POSIXct" は、1970 年初頭からの (符号付き) 秒数を数値ベクトルとして表します。

クラス「POSIXlt」は、sec 0–61: 秒 min 0–59: 分 hour 0–23: 時間 mday 1–31: 日 mon 0–11: 年初からの月. year 1900 年からの年数。 wday 日曜日から始まる 0 ~ 6 曜日。yday 0 ~ 365: 年間通算日。isdst 夏時間フラグ。有効な場合は正、そうでない場合はゼロ、不明の場合は負。

つまり、bそれぞれ 8 の長さの 9 つのベクトルのリストです。

あなたが見ることができます:

sapply(b,length)

正確な変換を使用できます:

b_1 = as.POSIXlt(a, "%Y-%m-%d %H:%M:%S",tz="")
b_2 = as.POSIXct(a, "%Y-%m-%d %H:%M:%S",tz="")

length(b_1) # 9
length(b_2) # 8
于 2009-12-11T11:21:18.673 に答える