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