Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何应用需要扩展类(datetime)的函数?_Python_Pandas_Datetime_Class Extensions - Fatal编程技术网

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
)的函数,如何使用pandas
apply

具体来说,我想从优秀的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
,它是
时间戳的一个实例,不知道如何
%
a
datetime.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