Создание Pandas работы с маятником

Недавно я наткнулся на новую потрясающую pendulum library для упрощения работы с datetimes.

В pandas есть этот удобный to_datetime() метод, позволяющий преобразовывать ряды и другие объекты в datetimes:

raw_data['Mycol'] = pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

Каким будет канонический способ создания пользовательского метода to_<something>  в этом случае метод to_pendulum(), который мог бы преобразовывать строки строк даты непосредственно в pendulum objects?

Это может привести к Series, имеющему различные интересные возможности, например, преобразование ряда строк даты в серию "смещений отныне" - человеческий datetime отличается.

Ответ 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, упражнение в бесполезность.