2014-09-28 2 views
7

Auf der folgenden Serie mit der Serie anwenden:Unable Methoden auf Zeitstempel Einbauten

0 1411161507178 
1 1411138436009 
2 1411123732180 
3 1411167606146 
4 1411124780140 
5 1411159331327 
6 1411131745474 
7 1411151831454 
8 1411152487758 
9 1411137160544 
Name: my_series, dtype: int64 

Dieser Befehl (konvertieren zu Zeitstempel, zu lokalisieren und zu EST konvertieren) funktioniert:

pd.to_datetime(my_series, unit='ms').apply(lambda x: x.tz_localize('UTC').tz_convert('US/Eastern')) 

aber dieses versagt:

pd.to_datetime(my_series, unit='ms').tz_localize('UTC').tz_convert('US/Eastern') 

mit:

TypeError         Traceback (most recent call last) 
<ipython-input-3-58187a4b60f8> in <module>() 
----> 1 lua = pd.to_datetime(df[column], unit='ms').tz_localize('UTC').tz_convert('US/Eastern') 

/Users/josh/anaconda/envs/py34/lib/python3.4/site-packages/pandas/core/generic.py in tz_localize(self, tz, axis, copy, infer_dst) 
    3492     ax_name = self._get_axis_name(axis) 
    3493     raise TypeError('%s is not a valid DatetimeIndex or PeriodIndex' % 
-> 3494         ax_name) 
    3495    else: 
    3496     ax = DatetimeIndex([],tz=tz) 

TypeError: index is not a valid DatetimeIndex or PeriodIndex 

und so tut dieses:

my_series.tz_localize('UTC').tz_convert('US/Eastern') 

mit:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-0a7cb1e94e1e> in <module>() 
----> 1 lua = df[column].tz_localize('UTC').tz_convert('US/Eastern') 

/Users/josh/anaconda/envs/py34/lib/python3.4/site-packages/pandas/core/generic.py in tz_localize(self, tz, axis, copy, infer_dst) 
    3492     ax_name = self._get_axis_name(axis) 
    3493     raise TypeError('%s is not a valid DatetimeIndex or PeriodIndex' % 
-> 3494         ax_name) 
    3495    else: 
    3496     ax = DatetimeIndex([],tz=tz) 

TypeError: index is not a valid DatetimeIndex or PeriodIndex 

Soweit ich verstehe, der zweite Ansatz oben (die erste, die nicht) funktionieren sollte . Warum scheitert es?

+0

Ich bin nicht sicher, warum Ihre erste Methode in der Tat funktioniert, wie Sie für Ihre zweite Fehler Aussage ganz klar ist, wenn in der Tat Ihr Index Ihre int64 Werte dann die zweite Ansatz Arbeiten waren . – EdChum

Antwort

5

tz_localize/tz_convert handeln Sie auf den INDEX des Objekts, nicht auf die Werte. Am einfachsten ist es, es einfach in einen Index zu verwandeln, dann zu lokalisieren und zu konvertieren. Wenn Sie dann eine Reihe zurück möchten, können Sie to_series()

In [47]: pd.DatetimeIndex(pd.to_datetime(s,unit='ms')).tz_localize('UTC').tz_convert('US/Eastern') 
Out[47]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2014-09-19 17:18:27.178000-04:00, ..., 2014-09-19 10:32:40.544000-04:00] 
Length: 10, Freq: None, Timezone: US/Eastern 
14

Als Jeffs verwenden Antwort erwähnt, tz_localize() und tz_convert() wirken auf den Index, die Daten nicht. Das war eine große Überraschung für mich.

Da Jeffs Antwort geschrieben wurde, fügte Pandas 0.15 einen neuen Series.dt Accessor hinzu, der Ihrem Anwendungsfall hilft. Sie können dies jetzt tun:

pd.to_datetime(my_series, unit='ms').dt.tz_localize('UTC').dt.tz_convert('US/Eastern') 
+0

Das ist großartig! Ich möchte TimeStamp nicht als Index festlegen, manchmal könnten wir zwei TimeStamp verwenden, da es wirklich frustrierend ist, dass wir es in den Index konvertieren müssen. – user40780