Pandas: No se puede usar aplicar en series con valores de marca de tiempo

Creado en 3 ago. 2017  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

Ejemplo de código, un ejemplo que se puede copiar, si es posible

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

Descripción del problema

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.

Rendimiento esperado





Salida de pd.show_versions()

VERSIONES INSTALADAS

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

Timezones Usage Question

Todos 3 comentarios

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)]
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

matthiasroder picture matthiasroder  ·  3Comentarios

Ashutosh-Srivastav picture Ashutosh-Srivastav  ·  3Comentarios

ericdf picture ericdf  ·  3Comentarios

BDannowitz picture BDannowitz  ·  3Comentarios

idanivanov picture idanivanov  ·  3Comentarios