it-swarm.dev

في Pandas كيف أقوم بتحويل سلسلة من سلاسل التاريخ إلى كائنات وقت وتضعها في DataFrame؟

import pandas as pd
date_stngs = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')

a = pd.Series(range(4),index = (range(4)))

for idx, date in enumerate(date_stngs):
    a[idx]= pd.to_datetime(date)

ينتج عن هذا الكود خطأ:

TypeError: "الكائن" int غير قابل للتكرار "

هل يمكن لأحد أن يقول لي كيف أحصل على هذه السلسلة من سلاسل وقت التاريخ في DataFrame ككائنات DateTime؟

50
Dick Eshelman
>>> import pandas as pd
>>> date_stngs = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')
>>> a = pd.Series([pd.to_datetime(date) for date in date_stngs])
>>> a
0    2008-12-20 00:00:00
1    2008-12-21 00:00:00
2    2008-12-22 00:00:00
3    2008-12-23 00:00:00

تحديث

استخدم pandas.to_datetime (pd.Series (..)). انها موجزة وأسرع بكثير من الرمز أعلاه.

>>> pd.to_datetime(pd.Series(date_stngs))
0   2008-12-20 00:00:00
1   2008-12-21 00:00:00
2   2008-12-22 00:00:00
3   2008-12-23 00:00:00
54
falsetru
In [46]: pd.to_datetime(pd.Series(date_stngs))
Out[46]: 
0   2008-12-20 00:00:00
1   2008-12-21 00:00:00
2   2008-12-22 00:00:00
3   2008-12-23 00:00:00
dtype: datetime64[ns]

تحديث: المعيار

In [43]: dates = [(dt.datetime(1960, 1, 1)+dt.timedelta(days=i)).date().isoformat() for i in range(20000)]

In [44]: timeit pd.Series([pd.to_datetime(date) for date in dates])
1 loops, best of 3: 1.71 s per loop

In [45]: timeit pd.to_datetime(pd.Series(dates))
100 loops, best of 3: 5.71 ms per loop
37
waitingkuo

حل بسيط ينطوي على منشئ السلسلة. يمكنك ببساطة تمرير نوع البيانات إلى المعلمة dtype. أيضا ، to_datetime يمكن أن تأخذ الدالة سلسلة من السلاسل الآن.

إنشاء بيانات

date_strings = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')

الثلاثة ينتجون نفس الشيء

pd.Series(date_strings, dtype='datetime64[ns]')
pd.Series(pd.to_datetime(date_strings))
pd.to_datetime(pd.Series(date_strings))

المعايير

المعايير التي تقدمهاwaitingkuo خاطئة. الطريقة الأولى أبطأ قليلاً من الأخرى ، التي لها نفس الأداء.

import datetime as dt
dates = [(dt.datetime(1960, 1, 1)+dt.timedelta(days=i)).date().isoformat() 
         for i in range(20000)] * 100

%timeit pd.Series(dates, dtype='datetime64[ns]')
730 ms ± 9.06 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


%timeit pd.Series(pd.to_datetime(dates))
426 ms ± 3.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit pd.to_datetime(pd.Series(dates))
430 ms ± 5.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2
Ted Petrou