Pandas: Não é possível aplicar em séries com valores de carimbo de data / hora

Criado em 3 ago. 2017  ·  3Comentários  ·  Fonte: pandas-dev/pandas

Amostra de código, um exemplo que pode ser copiado e colado, se possível

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

Descrição do Problema

Eu tenho uma série com carimbos de data / hora como valores em vez de índice. Espero que o método apply seja chamado em cada elemento, mas não é, em vez disso, ele é chamado em um DatetimeIndex.

Saída Esperada





Resultado de pd.show_versions()

VERSÕES INSTALADAS

commit: Nenhum
python: 3.6.0.final.0
python-bits: 64
OS: Darwin
Versão do sistema operacional: 16.7.0
máquina: x86_64
processador: i386
byteorder: pouco
LC_ALL: Nenhum
LANG: en_CA.UTF-8
LOCALE: en_CA.UTF-8

pandas: 0,20,2
pytest: 3.0.5
pip: 9.0.1
ferramentas de configuração: 35.0.1
Cython: Nenhum
numpy: 1.13.0
scipy: 0.19.1
xarray: 0.9.6
IPython: 6.0.0
esfinge: 1.5.3
patsy: nenhum
dateutil: 2.6.0
pytz: 2016.10
blosc: nenhum
gargalo: 1.2.0
tabelas: Nenhum
numexpr: nenhum
pena: nenhuma
matplotlib: 2.0.0
openpyxl: 2.4.8
xlrd: 1.0.0
xlwt: Nenhum
xlsxwriter: 0.9.8
lxml: Nenhum
bs4: Nenhum
html5lib: 0,999
sqlalchemy: Nenhum
pymysql: Nenhum
psycopg2: Nenhum
jinja2: 2.9.5
s3fs: nenhum
pandas_gbq: Nenhum
pandas_datareader: Nenhum

Timezones Usage Question

Todos 3 comentários

Além disso, algumas informações sobre meu caso de uso:

Quero aplicar o método tz_localize a cada registro de data e hora da série. Eu tentei originalmente tz_localize na própria série, mas isso gerou

TypeError: index is not a valid DatetimeIndex or PeriodIndex

Sei que é possível fazer isso usando reindex , mas gostaria de saber se também seria possível fazer isso com carimbos de data / hora como valores de série.

@nathanielatom você pode usar tz_localize / tz_convert na série por meio do acessor 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]

Além disso, a razão de você obter a saída que vê com apply , é porque apply tentará primeiro invocar a função em todos os valores (que são mantidos sob o capô como um DatetimeIndex, embora sejam os valores da série ), e somente se isso falhar, irá chamar a função em cada elemento.

Se você adaptar a função um pouco para aumentar quando não obtiver um valor escalar, verá a saída 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)]
Esta página foi útil?
0 / 5 - 0 avaliações