131

この関数tz_localizeを使用して Timestamp または DateTimeIndex タイムゾーンを認識させることができますが、その逆を行うにはどうすればよいでしょうか: タイムゾーンを保持しながら、タイムゾーンを認識するタイムスタンプをナイーブなタイムスタンプに変換するにはどうすればよいでしょうか?

例:

In [82]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10, freq='s', tz="Europe/Brussels")

In [83]: t
Out[83]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels

タイムゾーンを None に設定して削除することもできますが、結果は UTC に変換されます (12 時が 10 になりました)。

In [86]: t.tz = None

In [87]: t
Out[87]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 10:00:00, ..., 2013-05-18 10:00:09]
Length: 10, Freq: S, Timezone: None

DateTimeIndex をナイーブなタイムゾーンに変換できる別の方法はありますが、設定されたタイムゾーンを保持していますか?


私がこれを尋ねている理由についてのいくつかの文脈:私はタイムゾーンの単純な時系列を扱いたいです(タイムゾーンの余分な手間を避けるために、私が取り組んでいるケースでは必要ありません)。
しかし、何らかの理由で、ローカル タイムゾーン (ヨーロッパ/ブリュッセル) でタイムゾーン対応の時系列を処理する必要があります。他のすべてのデータはタイムゾーン ナイーブ (ただし、ローカル タイムゾーンで表される) であるため、この時系列をナイーブに変換してさらに作業したいと考えていますが、ローカル タイムゾーンでも表す必要があります (タイムゾーン情報を削除するだけで、ユーザーに表示される時刻を UTC に変換せずに)。

時間は実際には UTC として内部に保存され、それを表すときにのみ別のタイムゾーンに変換されることを知っているため、「非ローカライズ」したい場合は何らかの変換が必要です。たとえば、Python の datetime モジュールを使用すると、次のようにタイムゾーンを「削除」できます。

In [119]: d = pd.Timestamp("2013-05-18 12:00:00", tz="Europe/Brussels")

In [120]: d
Out[120]: <Timestamp: 2013-05-18 12:00:00+0200 CEST, tz=Europe/Brussels>

In [121]: d.replace(tzinfo=None)
Out[121]: <Timestamp: 2013-05-18 12:00:00> 

したがって、これに基づいて、次のことができますが、より大きな時系列で作業する場合、これはあまり効率的ではないと思います。

In [124]: t
Out[124]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels

In [125]: pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])
Out[125]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: None, Timezone: None
4

9 に答える 9

8

tzインデックスの属性を明示的に設定するとうまくいくようです:

ts_utc = ts.tz_convert("UTC")
ts_utc.index.tz = None
于 2014-02-25T14:30:08.510 に答える