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'>
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.
pd.show_versions()
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
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)]