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'>
Tengo una serie con marcas de tiempo como valores en lugar del índice. Espero que se llame al método de aplicación en cada elemento, pero no es así, sino que se llama en un DatetimeIndex.
pd.show_versions()
cometer: Ninguno
python: 3.6.0.final.0
bits de pitón: 64
SO: Darwin
Versión del SO: 16.7.0
máquina: x86_64
procesador: i386
byteorder: pequeño
LC_ALL: Ninguno
IDIOMA: en_CA.UTF-8
LOCALE: en_CA.UTF-8
pandas: 0.20.2
pytest: 3.0.5
pip: 9.0.1
herramientas de configuración: 35.0.1
Cython: Ninguno
numpy: 1.13.0
scipy: 0.19.1
Matriz X: 0.9.6
IPython: 6.0.0
esfinge: 1.5.3
patsy: Ninguno
dateutil: 2.6.0
pytz: 2016.10
blosc: Ninguno
cuello de botella: 1.2.0
tablas: ninguna
numexpr: Ninguno
pluma: ninguna
matplotlib: 2.0.0
openpyxl: 2.4.8
xlrd: 1.0.0
xlwt: Ninguno
xlsxwriter: 0.9.8
lxml: Ninguno
bs4: Ninguno
html5lib: 0.999
sqlalchemy: Ninguno
pymysql: Ninguno
psycopg2: Ninguno
jinja2: 2.9.5
s3fs: Ninguno
pandas_gbq: Ninguno
pandas_datareader: Ninguno
Además, algo de información sobre mi caso de uso:
Quiero aplicar el método tz_localize
a cada marca de tiempo de la serie. Originalmente probé tz_localize
en la propia serie, pero eso generó
TypeError: index is not a valid DatetimeIndex or PeriodIndex
Me doy cuenta de que es posible lograr esto usando reindex
, pero me preguntaba si también era posible hacer esto con las marcas de tiempo como valores de serie.
@nathanielatom puede usar tz_localize
/ tz_convert
en la Serie a través del acceso 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]
Además, la razón por la que obtiene la salida que ve con apply
, es porque aplicar primero intentará invocar la función en todos los valores (que se mantienen bajo el capó como un DatetimeIndex, aunque son los valores de la Serie ), y solo si eso falla, llamará a la función en cada elemento.
Si adapta un poco la función para aumentar cuando no obtiene un valor escalar, verá la salida esperada:
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)]