Pandas: Невозможно использовать применить к серии со значениями отметки времени

Созданный на 3 авг. 2017  ·  3Комментарии  ·  Источник: pandas-dev/pandas

Пример кода, копируемый пример, если возможно

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: Нет

Timezones Usage Question

Все 3 Комментарий

Кроме того, некоторая информация о моем варианте использования:

Я хочу применить метод 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)]
Была ли эта страница полезной?
0 / 5 - 0 рейтинги