3

pandas-0.8rc2 を使用して、UTC オフセット情報を欠くローカライズされた日時文字列の 2 つの列を含む入力 CSV を読み取り、データフレーム シリーズを UTC に適切に変換する必要があります。

タイムスタンプ列はどちらもインデックスを表しておらず、データであるという事実を軽減するための回避策を試みてきました。tz_localize と tz_convert は明らかに、列ではなくシリーズ/データフレームのインデックスでのみ機能します。次のコードではなく、それを行うためのより良いアプローチを学びたいと思います。

# test.py
import pandas

# input.csv:
# starting,ending,measure
# 2012-06-21 00:00,2012-06-23 07:00,77
# 2012-06-23 07:00,2012-06-23 16:30,65
# 2012-06-23 16:30,2012-06-25 08:00,77
# 2012-06-25 08:00,2012-06-26 12:00,0
# 2012-06-26 12:00,2012-06-27 08:00,77

df = pandas.read_csv('input.csv', parse_dates=[0,1])
print df

ser_starting = df.starting
ser_starting.index = ser_starting.values
ser_starting = ser_starting.tz_localize('US/Eastern')
ser_starting = ser_starting.tz_convert('UTC')

ser_ending = df.ending
ser_ending.index = ser_ending.values
ser_ending = ser_ending.tz_localize('US/Eastern')
ser_ending = ser_ending.tz_convert('UTC')

df.starting = ser_starting.index
print df
df.ending = ser_ending.index
print df

2 つ目は、コードに奇妙な動作が発生していることです。順序が df.starting か df.ending かに関係なく、2 番目の割り当てのタイムスタンプ データをデータ フレームに戻します。

$ python test.py 
              starting               ending  measure
0  2012-06-21 00:00:00  2012-06-23 07:00:00       77
1  2012-06-23 07:00:00  2012-06-23 16:30:00       65
2  2012-06-23 16:30:00  2012-06-25 08:00:00       77
3  2012-06-25 08:00:00  2012-06-26 12:00:00        0
4  2012-06-26 12:00:00  2012-06-27 08:00:00       77
             starting               ending  measure
0 2012-06-21 04:00:00  2012-06-23 07:00:00       77
1 2012-06-23 11:00:00  2012-06-23 16:30:00       65
2 2012-06-23 20:30:00  2012-06-25 08:00:00       77
3 2012-06-25 12:00:00  2012-06-26 12:00:00        0
4 2012-06-26 16:00:00  2012-06-27 08:00:00       77
Traceback (most recent call last):
  File "test.py", line 28, in <module>
    print df
  File "/path/to/lib/python2.7/site-packages/pandas/core/frame.py", line 572, in __repr__
    if self._need_info_repr_():
  File "/path/to/lib/python2.7/site-packages/pandas/core/frame.py", line 560, in _need_info_repr_
    self.to_string(buf=buf)
  File "/path/to/lib/python2.7/site-packages/pandas/core/frame.py", line 1207, in to_string
    formatter.to_string(force_unicode=force_unicode)
  File "/path/to/lib/python2.7/site-packages/pandas/core/format.py", line 200, in to_string
    fmt_values = self._format_col(i)
  File "/path/to/lib/python2.7/site-packages/pandas/core/format.py", line 242, in _format_col
    space=self.col_space)
  File "/path/to/lib/python2.7/site-packages/pandas/core/format.py", line 462, in format_array
    return fmt_obj.get_result()
  File "/path/to/lib/python2.7/site-packages/pandas/core/format.py", line 589, in get_result
    fmt_values = [formatter(x) for x in self.values]
  File "/path/to/lib/python2.7/site-packages/pandas/core/format.py", line 597, in _format_datetime64
    base = stamp.strftime('%Y-%m-%d %H:%M:%S')
ValueError: year=1768 is before 1900; the datetime strftime() methods require year >= 1900

print ステートメントは、問題を示すためのものです。repr や strftime を呼び出す他のメソッドを避けると、間違った値が例外なく引き継がれます。

奇妙な部分は、repl で df.{starting,ending} 割り当てを呼び出し続けると、通常、タイムスタンプ付きの正しいデータフレームになってしまうことです。

In [151]: df
Out[151]: 
             starting              ending  measure
0 2012-06-21 04:00:00 2012-06-23 11:00:00  77
1 2012-06-23 11:00:00 2012-06-23 20:30:00  65
2 2012-06-23 20:30:00 2012-06-25 12:00:00  77
3 2012-06-25 12:00:00 2012-06-26 16:00:00   0
4 2012-06-26 16:00:00 2012-06-27 12:00:00  77

これは繰り返し可能ではありません、AFAICT、上記の ValueError を通過する呼び出しの正確なシーケンスを説明することはできませんが、そうです

バグに直面しているかどうか、またはこれがサポートされていない API の使用法であるかどうかについて、ご意見をお寄せいただければ幸いです。

そして、上記のように、この方法を避けるために pandas API のより良い使い方を学びたいと思います。

4

1 に答える 1

5

ここにバグが潜んでいる可能性があるため、ここに問題を作成しました。すぐに確認してお知らせします。

https://github.com/pydata/pandas/issues/1518

編集:あなたが遭遇したバグは修正されました。1900年以前の表示の問題も今すぐ修正します。

于 2012-06-24T14:23:55.917 に答える