pandas read_csv () voert lokale datetime strings in, tz_convert naar UTC

Ik gebruik pandas-0.8rc2 om een ​​invoer-CSV te lezen met twee kolommen gelokaliseerd datetime-reeksen ontbreken UTC-offsetinformatie en hebben de dataframe-reeks nodig correct geconverteerd naar UTC.

Ik heb workarounds geprobeerd om het feit dat geen van beide timestamp-kolommen te verzachten vertegenwoordigen de index, het zijn gegevens. tz_localize en tz_convert werken blijkbaar alleen op de index van een serie/dataframe, geen kolom. Ik zou heel graag willen leer een betere aanpak om dat te doen, in plaats van de volgende code:

# 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

Ten tweede treft de code wat vreemd gedrag aan. Het verandert de tijdstempel gegevens van de tweede toewijzing terug naar het dataframe, ongeacht of de volgorde is df.starting of df.ending:

$ 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 
    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

De afdrukinstructies dienen alleen om het probleem aan te tonen. De onjuiste waarden zal zonder uitzondering doorgaan als ik repr en andere methoden die callen vermijd strftime.

Het vreemde is dat als ik de opdrachten df. {Begin, einde} blijf aanroepen bij de repl krijg ik meestal een correct dataframe met tijdstempels:

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

Dit is niet herhaalbaar, AFAICT, ik kan de exacte volgorde van oproepen niet beschrijven dat komt voorbij de ValueError hierboven, maar het doet

Ik zou het op prijs stellen als ik erover nadenk of ik een fout heb, of als dit een niet-ondersteund API-gebruik is.

En zoals hierboven vermeld, leer ik liever een beter gebruik van de Panda's API om het op deze manier te vermijden.

3

1 antwoord

het lijkt erop dat er misschien een bug op de loer ligt, dus ik heb hier een probleem gemaakt, neem snel een kijkje en laat het je weten:

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

EDIT: de bug die je tegenkwam, is opgelost. Ik ga nu ook het weergave-probleem van vóór 1900 oplossen.

5
toegevoegd