Python Pandas: Как применить функцию, требующую расширенного класса (datetime)? - PullRequest
0 голосов
/ 14 мая 2018

Как я могу использовать панд apply для функции, которая требует расширения стандартного класса (datetime)?

В частности, я хотел бы импортировать datetime_modulo из превосходной сущности на https://gist.github.com/treyhunner/6218526.

Этот код расширяет стандартный класс datetime, позволяя применять операцию по модулю к datetime объектам, например,

from datetime_modulo import datetime
from datetime import timedelta
d = datetime.now()
print d % timedelta(seconds=60)

Теперь мне нужно apply эту операцию по модулю для столбца / серии DataFrame pandas, например,

df['dates'] = pd.to_datetime(df.index.values)
df['datetime_mod'] = df['dates'].apply(lambda x: x % timedelta(minutes=15))

Но pandas не может обнаружить расширенный класс datetime (если я просто не использую его неправильно):

TypeError: unsupported operand type(s) for %: 'Timestamp' and 'datetime.timedelta'

Как продолжить?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Вы можете попробовать, согласно этому предложению , преобразовать операнд в datetime явно:

from datetime_modulo import datetime
from datetime import timedelta

df = pd.DataFrame({'Time': [pd.to_datetime('now')]})

def modulo(x):
    dt = datetime(year=x.year,month=x.month,day=x.day, hour=x.hour, minute=x.minute, second=x.second)
    return dt % timedelta(seconds=60)

df['Time'] = df['Time'].apply(modulo)
0 голосов
/ 14 мая 2018

В общем, вы должны стараться избегать звонков на apply в Пандах, так как это очень медленно.Например, если вы пытаетесь узнать минуты в течение четверти часа, вы можете использовать:

from datetime import timedelta
df = pd.DataFrame({'dates': pd.to_datetime(['2071-12-12 10:04:44', '2071-12-12 10:30:44'])})
>>> df.dates.dt.minute.mod(15)
0    4
1    0
Name: dates, dtype: int64
0 голосов
/ 14 мая 2018

Вы правы, вы просто неправильно его используете.

См. Ошибку: TypeError: unsupported operand type(s) for %: 'Timestamp' and 'datetime.timedelta'.

Эта ошибка означает, что вы не можете просто написать x % timedelta(minutes=15) и надеяться, что это сработает.Это не может.x, который является экземпляром Timestamp, не знает, как % a datetime.timedelta.Если вы хотите, чтобы это работало, вам по крайней мере нужно конвертировать x в datetime_modulo.datetime.

...