Python:如何应用需要扩展类(datetime)的函数?
对于需要扩展标准类(Python:如何应用需要扩展类(datetime)的函数?,python,pandas,datetime,class-extensions,Python,Pandas,Datetime,Class Extensions,对于需要扩展标准类(datetime)的函数,如何使用pandasapply 具体来说,我想从优秀的gist中导入datetime\u modulo 此代码扩展了标准的datetime类,以允许对datetime对象应用模运算,例如 from datetime_modulo import datetime from datetime import timedelta d = datetime.now() print d % timedelta(seconds=60) 现在我需要将此模运算应用于
datetime
)的函数,如何使用pandasapply
具体来说,我想从优秀的gist中导入datetime\u modulo
此代码扩展了标准的datetime
类,以允许对datetime
对象应用模运算,例如
from datetime_modulo import datetime
from datetime import timedelta
d = datetime.now()
print d % timedelta(seconds=60)
现在我需要将此模运算应用于熊猫数据帧列/系列,例如
df['dates'] = pd.to_datetime(df.index.values)
df['datetime_mod'] = df['dates'].apply(lambda x: x % timedelta(minutes=15))
但是pandas无法检测扩展的datetime类(除非我只是错误地使用它):
如何继续?你是对的,只是用错了
请参阅错误:TypeError:不支持%的操作数类型:“Timestamp”和“datetime.timedelta”
此错误意味着您不能简单地编写x%timedelta(分钟=15)
,希望它能工作。它不能x
,它是时间戳的一个实例,不知道如何%
adatetime.timedelta
。如果您想让它工作,您至少需要将x
转换为datetime\u 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
回答得好<代码>lambda x:datetime(x)%timedelta(分钟=15)
?@Sraw建议的解决方案在哪里?非常好的答案@AmiTavory,你的答案也是pandorableness+1:)。我的更麻烦,但有点通用,因为它可以处理(例如)天/分/秒的模数转换。@jpp太棒了,谢谢你,工作正常!我稍微修改了timedelta的参数(并将其更改为datetime),并自由编辑了您的答案-可以吗?@jtlz2,当然可以。谢谢您的帮助-事实上行数很小,问题确实涉及到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