3

如何将 pandasapply用于需要扩展标准类 ( datetime) 的功能?

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

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

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

现在我需要对applypandas DataFrame 列/系列进行模运算,例如

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'

如何进行?

4

3 回答 3

3

您可以尝试按照此建议将操作数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)
于 2018-05-14T07:54:43.130 回答
3

一般来说,你应该尽量避免apply在 Pandas 中调用,因为它非常慢。例如,如果您想找出一刻钟内的分钟数,您可以使用:

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
于 2018-05-14T07:55:59.093 回答
2

你是对的,你只是用错了。

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

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

于 2018-05-14T07:39:27.727 回答