Pandas: Kann nicht für Serien mit Zeitstempelwerten angewendet werden

Erstellt am 3. Aug. 2017  ·  3Kommentare  ·  Quelle: pandas-dev/pandas

Codebeispiel, wenn möglich ein kopierfähiges Beispiel

import pandas as pd

ts = pd.Series([pd.Timestamp('2017-07-31 20:08:46.110998-04:00'), 
                pd.Timestamp('2017-08-01 20:08:46.110998-04:00'), 
                pd.Timestamp('2017-08-02 20:08:46.110998-04:00')])

def func(elem):
    print(type(elem))
    return elem
print(type(ts))
print(type(ts[0]))

ts.apply(func);

# Prints out:
# <class 'pandas.core.series.Series'>
# <class 'pandas._libs.tslib.Timestamp'>
# <class 'pandas.core.indexes.datetimes.DatetimeIndex'>

Problembeschreibung

Ich habe eine Serie mit Zeitstempeln als Werten anstelle des Index. Ich erwarte, dass die Methode apply für jedes Element aufgerufen wird, aber nicht, sondern für einen DatetimeIndex.

Erwartete Ausgabe





Ausgabe von pd.show_versions()

INSTALLIERTE VERSIONEN

Festschreiben: Keine
Python: 3.6.0.final.0
Python-Bits: 64
OS: Darwin
Betriebssystemversion: 16.7.0
Maschine: x86_64
Prozessor: i386
Byteorder: wenig
LC_ALL: Keine
LANG: en_CA.UTF-8
LOCALE: en_CA.UTF-8

Pandas: 0,20,2
Pytest: 3.0.5
pip: 9.0.1
setuptools: 35.0.1
Cython: Keine
Anzahl: 1.13.0
scipy: 0.19.1
xarray: 0.9.6
IPython: 6.0.0
Sphinx: 1.5.3
Patsy: Keine
Datum: 2.6.0
pytz: 2016.10
blosc: Keine
Engpass: 1.2.0
Tabellen: Keine
numexpr: Keine
Feder: Keine
matplotlib: 2.0.0
openpyxl: 2.4.8
xlrd: 1.0.0
xlwt: Keine
xlsxwriter: 0.9.8
lxml: Keine
bs4: Keine
html5lib: 0,999
sqlalchemy: Keine
pymysql: Keine
psycopg2: Keine
jinja2: 2.9.5
s3fs: Keine
pandas_gbq: Keine
pandas_datareader: Keine

Timezones Usage Question

Alle 3 Kommentare

Außerdem einige Informationen zu meinem Anwendungsfall:

Ich möchte die tz_localize -Methode auf jeden Zeitstempel in der Serie anwenden. Ich habe ursprünglich tz_localize für die Serie selbst ausprobiert, aber das hat sich erhöht

TypeError: index is not a valid DatetimeIndex or PeriodIndex

Mir ist klar, dass es möglich ist, dies mit reindex , aber ich habe mich gefragt, ob dies auch mit Zeitstempeln als Serienwerten möglich ist.

@nathanielatom Sie können tz_localize / tz_convert für die Serie über den Accessor dt :

In [19]: ts.dt.tz_convert('UTC')
Out[19]: 
0   2017-08-01 00:08:46.110998+00:00
1   2017-08-02 00:08:46.110998+00:00
2   2017-08-03 00:08:46.110998+00:00
dtype: datetime64[ns, UTC]

Der Grund, warum Sie die Ausgabe erhalten, die Sie mit apply , ist, dass apply zuerst versucht, die Funktion für alle Werte aufzurufen (die als DatetimeIndex unter der Haube gehalten werden, obwohl es sich um die Werte der Serie handelt ), und nur wenn dies fehlschlägt, wird die Funktion für jedes Element aufgerufen.

Wenn Sie die Funktion ein wenig anpassen, um sie zu erhöhen, wenn sie keinen Skalarwert erhält, wird die erwartete Ausgabe angezeigt:

In [21]: def func(elem):
    ...:     assert not hasattr(elem, 'ndim')
    ...:     print(type(elem))
    ...:     return elem
    ...: 

In [22]: ts.apply(func)
<class 'pandas._libs.tslib.Timestamp'>
<class 'pandas._libs.tslib.Timestamp'>
<class 'pandas._libs.tslib.Timestamp'>
Out[22]: 
0   2017-07-31 20:08:46.110998-04:00
1   2017-08-01 20:08:46.110998-04:00
2   2017-08-02 20:08:46.110998-04:00
dtype: datetime64[ns, pytz.FixedOffset(-240)]
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ericdf picture ericdf  ·  3Kommentare

Ashutosh-Srivastav picture Ashutosh-Srivastav  ·  3Kommentare

amelio-vazquez-reina picture amelio-vazquez-reina  ·  3Kommentare

MatzeB picture MatzeB  ·  3Kommentare

idanivanov picture idanivanov  ·  3Kommentare