如何将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'
如何进行?
答案 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)
并希望它可以正常工作。这不可以。 x
是Timestamp
的一个实例,我不知道如何%
datetime.timedelta
。如果您希望它有效,您至少需要将x
转换为datetime_modulo.datetime
。