5

csvフォーマットのサンプルデータ。ファイルに保存broken_posix.csv

Date
3/10/2012 23:00
3/11/2012 0:00
3/11/2012 1:00
3/11/2012 2:00
3/11/2012 3:00
3/11/2012 4:00
3/11/2012 5:00
3/11/2012 6:00
3/11/2012 7:00
3/11/2012 8:00
3/11/2012 9:00
3/11/2012 10:00
3/11/2012 11:00
3/11/2012 12:00
3/11/2012 13:00
3/11/2012 14:00
3/11/2012 15:00
3/11/2012 16:00
3/11/2012 17:00
3/11/2012 18:00
3/11/2012 19:00
3/11/2012 20:00
3/11/2012 21:00
3/11/2012 22:00
3/11/2012 23:00
3/12/2012 0:00
3/12/2012 1:00
3/12/2012 2:00
3/12/2012 3:00
3/12/2012 4:00
3/12/2012 5:00
3/12/2012 6:00
3/12/2012 7:00
3/12/2012 8:00
3/12/2012 9:00
3/12/2012 10:00
3/12/2012 11:00

だから私はこのファイルを持っていますbroken_posix.csv。私はファイルをうまく読むことができます

a_var <- read.csv("broken_posix.csv")

posixそれから私はそれを使用するように変換することができます

a_var_posixct = as.POSIXct(strptime( as.character( a_var$Date) , '%m/%d/%Y %H:%M'))

またはと

a_var_posixlt = strptime(as.character( a_var$Date) , '%m/%d/%Y %H:%M')

ただし、posixctを使用すると、毎年文字列に4つのNA値が含まれるため、問題が発生します。私が使用するとき、私はposixlt1つのNA値を取得しますMarch 11,2012 at 2 (daylight savings time)

走ると私が何を意味するのかわかるでしょう

which(is.na(a_var_posixct))
which(is.na(a_var_posixlt))

a_var_posixct[4]
a_var_posixlt[4]

NA4番目の値は、明らかにposixltの日付値ですが、操作を適用するときは常に値です。

値を省略して、posix文字列の残りの部分を台無しにしてしまうようにしました。NAフラグをクリアしようとして、posix文字列をそれ自体として設定しようとしましたが、効果はありませんでした。時間と分のフォーマットを失うためだけに、文字値として設定しようとしました。

このような状況は、夏時間のせいで発生すると思います。日付に他の関数を実行しようとすると、NA値を変更できないため、NA値を回避する必要があるため、対処するのは非常にイライラします。データを日ごとに集計したり、日付オブジェクトを使用したりすることもできますが、それは適切な方法ではないようです。

4

3 に答える 3

5

夏時間のないタイムゾーンを使用すると、この種の問題が解決します。

a_var_posixlt = strptime(as.character( a_var$Date) , '%m/%d/%Y %H:%M',tz="GMT")
于 2012-07-17T20:02:17.447 に答える
2

から?as.POSIXct

文字入力は最初にstrptimeによってクラス「POSIXlt」に変換されます。数値入力は最初に「POSIXct」に変換されます。2つの日時クラス間を移動する必要がある変換には、タイムゾーンが必要です。「POSIXlt」から「POSIXct」への変換は、選択したタイムゾーンの時刻を検証します。1つの問題は、たとえば英国でのDSTへの移行およびDSTからの移行で何が起こるかです。

as.POSIXct(strptime('2011-03-27 01:30:00', '%Y-%m-%d %H:%M:%S'))
as.POSIXct(strptime('2010-10-31 01:30:00', '%Y-%m-%d %H:%M:%S'))

それぞれ無効(時計が1:00GMTから2:00BSTに進んだ)とあいまい(時計が2:00BSTから1:00GMTに戻った)です。このような場合に発生するのは OS固有です。最初はNAであると予想する必要がありますが、2番目はBSTまたはGMTのいずれかとして解釈できます(一般的なOSは両方の可能な値を提供します)。また、OS機能が無効な時間を正しくフォーマットしない場合があることに注意してください(strftimeを参照)。

あなたの4つのNAは、おそらく年に2回時計が変わる時間になります。

于 2012-07-17T20:08:21.300 に答える
0

問題を再現することはできませんが、ここで試すことができることがいくつかあります。

最初に確認することは、データが正しいことです。この質問からデータセットをコピーして貼り付け、マシンで再度実行します。それでもエラーが発生しますか?そうでない場合は、データセットにタイプミスがある可能性があります。また、DavidRobinsonによって提案された行を試してください。

as.POSIXlt(strptime("3/11/2012 2:00", '%m/%d/%Y %H:%M'))

これは戻りNAますか?

奇妙な日付関連NAのもう1つのソースは、ロケールです。使用しているものを確認してください

Sys.getlocale("LC_TIME")

次に、別のものに変更します。使用可能なロケールはOSによって異なります(混乱しています)が、を見てくださいexample(Sys.setlocale)

于 2012-07-17T19:57:39.767 に答える