Ответ 1
Каким будет канонический способ создания пользовательского
to_<something>
метод - в этом случае методto_pendulum()
, который мог бы конвертировать строки строк даты непосредственно в объектыPendulum
?
Посмотрев через API немного, я должен сказать, что я впечатлен тем, что они сделали. К сожалению, я не думаю, что Pendulum
и pandas
могут работать вместе (по крайней мере, с текущей последней версией - v0.21
).
Самая важная причина в том, что pandas
не поддерживает Pendulum
в качестве типа данных. Все основанные на принципе типы данных (np.int
, np.float
и np.datetime64
) поддерживают векторизацию в некоторой форме. Вы не сможете добиться улучшения производительности, используя фрейм данных, например, цикл и список ванили. Если что-либо, вызов apply
в Series
с объектами Pendulum
будет медленнее (из-за всех накладных расходов API).
Другая причина заключается в том, что Pendulum
является подклассом datetime
-
from datetime import datetime
isinstance(pendulum.now(), datetime)
True
Это важно, поскольку, как упоминалось выше, datetime
является поддерживаемым типом данных, поэтому pandas будет пытаться принудить datetime
к pandas 'родному формату datetime - Timestamp
. Вот пример.
print(s)
0 2017-11-09 18:43:45
1 2017-11-09 20:15:27
2 2017-11-09 22:29:00
3 2017-11-09 23:42:34
4 2017-11-10 00:09:40
5 2017-11-10 00:23:14
6 2017-11-10 03:32:17
7 2017-11-10 10:59:24
8 2017-11-10 11:12:59
9 2017-11-10 13:49:09
s = s.apply(pendulum.parse)
s
0 2017-11-09 18:43:45+00:00
1 2017-11-09 20:15:27+00:00
2 2017-11-09 22:29:00+00:00
3 2017-11-09 23:42:34+00:00
4 2017-11-10 00:09:40+00:00
5 2017-11-10 00:23:14+00:00
6 2017-11-10 03:32:17+00:00
7 2017-11-10 10:59:24+00:00
8 2017-11-10 11:12:59+00:00
9 2017-11-10 13:49:09+00:00
Name: timestamp, dtype: datetime64[ns, <TimezoneInfo [UTC, GMT, +00:00:00, STD]>]
s[0]
Timestamp('2017-11-09 18:43:45+0000', tz='<TimezoneInfo [UTC, GMT, +00:00:00, STD]>')
type(s[0])
pandas._libs.tslib.Timestamp
Итак, с некоторой трудностью (с участием dtype=object
) вы можете загрузить объекты Pendulum
в dataframes. Вот как вы это сделаете -
v = np.vectorize(pendulum.parse)
s = pd.Series(v(s), dtype=object)
s
0 2017-11-09T18:43:45+00:00
1 2017-11-09T20:15:27+00:00
2 2017-11-09T22:29:00+00:00
3 2017-11-09T23:42:34+00:00
4 2017-11-10T00:09:40+00:00
5 2017-11-10T00:23:14+00:00
6 2017-11-10T03:32:17+00:00
7 2017-11-10T10:59:24+00:00
8 2017-11-10T11:12:59+00:00
9 2017-11-10T13:49:09+00:00
s[0]
<Pendulum [2017-11-09T18:43:45+00:00]>
Однако это по сути бесполезно, потому что вызов любого метода Pendulum
(через apply
) теперь будет не только супер медленным, но и в итоге снова будет принудительно возвращен к Timestamp
, упражнение в бесполезность.