Pandas: Tidak dapat menggunakan terapkan pada Rangkaian dengan nilai Stempel Waktu

Dibuat pada 3 Agu 2017  ·  3Komentar  ·  Sumber: pandas-dev/pandas

Contoh Kode, contoh copy-paste jika memungkinkan

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

Deskripsi masalah

Saya memiliki Seri dengan Stempel Waktu sebagai nilai, bukan indeks. Saya berharap metode apply dipanggil pada setiap elemen, tetapi ternyata tidak, melainkan dipanggil pada DatetimeIndex.

Output yang Diharapkan





Output pd.show_versions()

VERSI TERPASANG

commit: Tidak ada
python: 3.6.0.final.0
python-bits: 64
OS: Darwin
Rilis OS: 16.7.0
mesin: x86_64
prosesor: i386
byteorder: sedikit
LC_ALL: Tidak ada
LANG: en_CA.UTF-8
LOCALE: en_CA.UTF-8

panda: 0.20.2
pytest: 3.0.5
pip: 9.0.1
setuptools: 35.0.1
Cython: Tidak ada
numpy: 1.13.0
scipy: 0.19.1
xarray: 0.9.6
IPython: 6.0.0
sphinx: 1.5.3
patsy: Tidak ada
dateutil: 2.6.0.0
pytz: 2016.10
blosc: Tidak ada
kemacetan: 1.2.0
tabel: Tidak ada
numexpr: Tidak ada
bulu: Tidak ada
matplotlib: 2.0.0
openpyxl: 2.4.8
xlrd: 1.0.0
xlwt: Tidak ada
xlsxwriter: 0.9.8
lxml: Tidak ada
bs4: Tidak ada
html5lib: 0,999
sqlalchemy: Tidak ada
pymysql: Tidak ada
psycopg2: Tidak ada
jinja2: 2.9.5
s3fs: Tidak ada
pandas_gbq: Tidak ada
pandas_datareader: Tidak ada

Timezones Usage Question

Semua 3 komentar

Juga, beberapa info tentang kasus penggunaan saya:

Saya ingin menerapkan metode tz_localize ke setiap Stempel Waktu dalam rangkaian. Saya awalnya mencoba tz_localize pada seri itu sendiri, tetapi itu meningkat

TypeError: index is not a valid DatetimeIndex or PeriodIndex

Saya menyadari adalah mungkin untuk mencapai ini dengan menggunakan reindex , tetapi saya bertanya-tanya apakah mungkin untuk melakukan ini dengan Stempel Waktu sebagai nilai Seri juga.

@nathanielatom Anda dapat menggunakan tz_localize / tz_convert pada Seri melalui dt accessor:

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]

Lebih lanjut, alasan Anda mendapatkan output yang Anda lihat dengan apply , adalah karena apply pertama kali akan mencoba memanggil fungsi pada semua nilai (yang disimpan di bawah tenda sebagai DatetimeIndex, meskipun itu adalah nilai Seri ), dan hanya jika gagal, akan memanggil fungsi pada setiap elemen.

Jika Anda mengadaptasi fungsi sedikit untuk dinaikkan ketika tidak mendapatkan nilai skalar, Anda akan melihat keluaran yang diharapkan:

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)]
Apakah halaman ini membantu?
0 / 5 - 0 peringkat