Python Pandas:如何应用需要扩展类(datetime)的函数?

时间:2018-05-14 07:14:04

标签: python pandas datetime class-extensions

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

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

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

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

现在我需要对pandas DataFrame列/系列进行apply这种模运算,例如

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 :(得分:3)

您可以根据this suggestion尝试将操作数明确转换为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)

答案 1 :(得分:3)

通常,您应该尽量避免在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

答案 2 :(得分:2)

你是对的,你只是错误地使用它。

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

此错误意味着您无法简单地编写x % timedelta(minutes=15)并希望它可以正常工作。这不可以。 xTimestamp的一个实例,我不知道如何% datetime.timedelta。如果您希望它有效,您至少需要将x转换为datetime_modulo.datetime