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'>
У меня есть серия с отметками времени в качестве значений, а не индекса. Я ожидаю, что метод apply будет вызываться для каждого элемента, но это не так, скорее он вызывается в DatetimeIndex.
pd.show_versions()
совершить: Нет
питон: 3.6.0.final.0
биты Python: 64
ОС: Дарвин
Релиз ОС: 16.7.0
машина: x86_64
процессор: i386
byteorder: маленький
LC_ALL: Нет
ЯЗЫК: en_CA.UTF-8
МЕСТОПОЛОЖЕНИЕ: en_CA.UTF-8
панды: 0.20.2
pytest: 3.0.5
пункт: 9.0.1
setuptools: 35.0.1
Cython: Нет
число: 1.13.0
scipy: 0.19.1
xarray: 0.9.6
IPython: 6.0.0
сфинкс: 1.5.3
Пэтси: Нет
dateutil: 2.6.0
pytz: 2016.10
blosc: Нет
узкое место: 1.2.0
таблицы: нет
numexpr: Нет
перо: нет
matplotlib: 2.0.0
openpyxl: 2.4.8
xlrd: 1.0.0
xlwt: Нет
xlsxwriter: 0.9.8
lxml: Нет
bs4: Нет
html5lib: 0,999
sqlalchemy: Нет
pymysql: Нет
psycopg2: Нет
jinja2: 2.9.5
s3fs: Нет
pandas_gbq: Нет
pandas_datareader: Нет
Кроме того, некоторая информация о моем варианте использования:
Я хочу применить метод tz_localize
к каждой метке времени в серии. Первоначально я пробовал tz_localize
на самой серии, но это подняло
TypeError: index is not a valid DatetimeIndex or PeriodIndex
Я понимаю, что этого можно добиться, используя reindex
, но мне было интересно, можно ли это сделать и с помощью временных меток как значений серии.
@nathanielatom вы можете использовать tz_localize
/ tz_convert
в Серии через аксессуар 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]
Кроме того, причина, по которой вы получаете результат, который вы видите с помощью apply
, заключается в том, что apply сначала попытается вызвать функцию для всех значений (которые хранятся под капотом как DatetimeIndex, хотя это значения Series ), и только в случае неудачи вызовет функцию для каждого элемента.
Если вы немного адаптируете функцию для увеличения, когда она не получает скалярное значение, вы увидите ожидаемый результат:
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)]