Python Pandas:如何应用需要扩展 class(日期时间)的函数?

Python Pandas: How do I apply a function requiring an extended class (datetime)?

如何将 pandas apply 用于需要扩展标准 class (datetime) 的函数?

具体来说,我想从 https://gist.github.com/treyhunner/6218526 的优秀要点导入 datetime_modulo

此代码扩展了标准 datetime class 以允许模运算应用于 datetime 对象,例如

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

现在我需要apply这个模运算到pandas DataFrame column/Series,例如

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

但是pandas无法检测到扩展的日期时间class(除非我只是错误地使用它):

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

如何进行?

你是对的,你只是用错了

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

这个错误意味着你不能简单地写 x % timedelta(minutes=15) 并希望它能工作。这不可以。 x,它是 Timestamp 的一个实例,不知道如何 % 一个 datetime.timedelta。如果你想让它工作,你至少需要将 x 转换为 datetime_modulo.datetime.

您可以按照 尝试将操作数显式转换为 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)

一般来说,您应该尽量避免在 Pandas 中调用 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