Pandas: Impossible d'utiliser Apply sur les séries avec des valeurs d'horodatage

Créé le 3 août 2017  ·  3Commentaires  ·  Source: pandas-dev/pandas

Exemple de code, un exemple copiable si possible

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

Description du problème

J'ai une série avec des horodatages comme valeurs plutôt que comme index. Je m'attends à ce que la méthode apply soit appelée sur chaque élément, mais ce n'est pas le cas, mais elle est appelée sur un DatetimeIndex.

Production attendue





Sortie de pd.show_versions()

VERSIONS INSTALLÉES

commit: aucun
python: 3.6.0.final.0
bits python: 64
OS: Darwin
Version du système d'exploitation: 16.7.0
machine: x86_64
processeur: i386
byteorder: petit
LC_ALL: Aucun
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: aucun
numpy: 1.13.0
scipy: 0.19.1
xarray: 0,9,6
IPython: 6.0.0
sphinx: 1.5.3
patsy: Aucun
dateutil: 2.6.0
pytz: 2016.10
blosc: Aucun
goulot d'étranglement: 1.2.0
tableaux: Aucun
numexpr: Aucun
plume: Aucune
matplotlib: 2.0.0
openpyxl: 2.4.8
xlrd: 1.0.0
xlwt: Aucun
xlsxwriter: 0.9.8
lxml: Aucun
bs4: Aucun
html5lib: 0,999
sqlalchemy: Aucun
pymysql: Aucun
psycopg2: Aucun
jinja2: 2.9.5
s3fs: Aucun
pandas_gbq: Aucun
pandas_datareader: Aucun

Timezones Usage Question

Tous les 3 commentaires

Aussi, quelques informations sur mon cas d'utilisation:

Je souhaite appliquer la méthode tz_localize à chaque horodatage de la série. J'ai initialement essayé tz_localize sur la série elle-même, mais cela a soulevé

TypeError: index is not a valid DatetimeIndex or PeriodIndex

Je me rends compte qu'il est possible d'y parvenir en utilisant reindex , mais je me demandais s'il était également possible de le faire avec les horodatages comme valeurs de série.

@nathanielatom vous pouvez utiliser tz_localize / tz_convert sur la série via l'accesseur 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]

De plus, la raison pour laquelle vous obtenez la sortie que vous voyez avec apply , est que apply essaiera d'abord d'appeler la fonction sur toutes les valeurs (qui sont conservées sous le capot en tant que DatetimeIndex, bien que ce soient les valeurs de la série ), et seulement si cela échoue, appellera la fonction sur chaque élément.

Si vous adaptez un peu la fonction pour augmenter lorsqu'elle n'obtient pas de valeur scalaire, vous voyez la sortie attendue:

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)]
Cette page vous a été utile?
0 / 5 - 0 notes