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'>
لدي سلسلة مع الطوابع الزمنية كقيم بدلاً من الفهرس. أتوقع أن يتم استدعاء طريقة التطبيق على كل عنصر ، لكنها ليست كذلك ، بل يتم استدعاؤها في DatetimeIndex.
pd.show_versions()
الالتزام: لا شيء
بيثون: 3.6.0.final.0
بتات الثعبان: 64
نظام التشغيل: داروين
إصدار نظام التشغيل: 16.7.0
الجهاز: x86_64
المعالج: i386
byteorder: قليلا
LC_ALL: لا شيء
LANG: en_CA.UTF-8
LOCALE: en_CA.UTF-8
الباندا: 0.20.2
بيتيست: 3.0.5
النقطة: 9.0.1
أدوات الإعداد: 35.0.1
سايثون: لا شيء
numpy: 1.13.0
scipy: 0.19.1
xarray: 0.9.6
إيثون: 6.0.0
أبو الهول: 1.5.3
باتسي: لا شيء
داتوتيل: 2.6.0
بيتز: 2016.10.21
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
، هو أن تطبيق سيحاول أولاً استدعاء الوظيفة على جميع القيم (التي يتم الاحتفاظ بها تحت غطاء المحرك كمؤشر تاريخ / وقت ، على الرغم من أنها قيم السلسلة ) ، وفقط في حالة فشل ذلك ، ستستدعي الوظيفة على كل عنصر.
إذا قمت بتكييف الدالة قليلاً لرفعها عندما لا تحصل على قيمة عددية ، فسترى الناتج المتوقع:
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)]