Pandas: لا يمكن استخدام تطبيق على السلسلة بقيم الطابع الزمني

تم إنشاؤها على ٣ أغسطس ٢٠١٧  ·  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'>

وصف المشكلة

لدي سلسلة مع الطوابع الزمنية كقيم بدلاً من الفهرس. أتوقع أن يتم استدعاء طريقة التطبيق على كل عنصر ، لكنها ليست كذلك ، بل يتم استدعاؤها في 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: لا شيء

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 ، هو أن تطبيق سيحاول أولاً استدعاء الوظيفة على جميع القيم (التي يتم الاحتفاظ بها تحت غطاء المحرك كمؤشر تاريخ / وقت ، على الرغم من أنها قيم السلسلة ) ، وفقط في حالة فشل ذلك ، ستستدعي الوظيفة على كل عنصر.

إذا قمت بتكييف الدالة قليلاً لرفعها عندما لا تحصل على قيمة عددية ، فسترى الناتج المتوقع:

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 التقييمات