Python Pandas:如何应用需要扩展 class(日期时间)的函数?
Python Pandas: How do I apply a function requiring an extended class (datetime)?
如何将 pandas apply
用于需要扩展标准 class (datetime
) 的函数?
具体来说,我想从 https://gist.github.com/treyhunner/6218526 的优秀要点导入 datetime_modulo
。
此代码扩展了标准 datetime
class 以允许模运算应用于 datetime
对象,例如
from datetime_modulo import datetime
from datetime import timedelta
d = datetime.now()
print d % timedelta(seconds=60)
现在我需要apply
这个模运算到pandas DataFrame column/Series,例如
df['dates'] = pd.to_datetime(df.index.values)
df['datetime_mod'] = df['dates'].apply(lambda x: x % timedelta(minutes=15))
但是pandas无法检测到扩展的日期时间class(除非我只是错误地使用它):
TypeError: unsupported operand type(s) for %: 'Timestamp' and 'datetime.timedelta'
如何进行?
你是对的,你只是用错了
看到错误:TypeError: unsupported operand type(s) for %: 'Timestamp' and 'datetime.timedelta'
。
这个错误意味着你不能简单地写 x % timedelta(minutes=15)
并希望它能工作。这不可以。 x
,它是 Timestamp
的一个实例,不知道如何 %
一个 datetime.timedelta
。如果你想让它工作,你至少需要将 x
转换为 datetime_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
如何将 pandas apply
用于需要扩展标准 class (datetime
) 的函数?
具体来说,我想从 https://gist.github.com/treyhunner/6218526 的优秀要点导入 datetime_modulo
。
此代码扩展了标准 datetime
class 以允许模运算应用于 datetime
对象,例如
from datetime_modulo import datetime
from datetime import timedelta
d = datetime.now()
print d % timedelta(seconds=60)
现在我需要apply
这个模运算到pandas DataFrame column/Series,例如
df['dates'] = pd.to_datetime(df.index.values)
df['datetime_mod'] = df['dates'].apply(lambda x: x % timedelta(minutes=15))
但是pandas无法检测到扩展的日期时间class(除非我只是错误地使用它):
TypeError: unsupported operand type(s) for %: 'Timestamp' and 'datetime.timedelta'
如何进行?
你是对的,你只是用错了
看到错误:TypeError: unsupported operand type(s) for %: 'Timestamp' and 'datetime.timedelta'
。
这个错误意味着你不能简单地写 x % timedelta(minutes=15)
并希望它能工作。这不可以。 x
,它是 Timestamp
的一个实例,不知道如何 %
一个 datetime.timedelta
。如果你想让它工作,你至少需要将 x
转换为 datetime_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