【问题标题】:pandas apply to attribute instead of function熊猫适用于属性而不是功能
【发布时间】:2017-01-19 14:23:11
【问题描述】:

是否可以使用 df.apply 来获取属性而不是运行函数?我想从日期中检索年份以执行 groupby。例如..

import pandas as pd
import datetime
import numpy as np

df = pd.DataFrame({'date': [datetime.datetime(2010,1,1)+datetime.timedelta(days=i*15) 
for i in range(0,100)]})

这行得通..

df['year'] = [d.year for d in df['date']]

这也有效..

df['year'] = df['date'].apply(lambda x: x.year)

但这不是..

df['year'] = df['date'].apply(year)

这也不是..

df['year'] = df['date'].year

最有效的方法是什么?

【问题讨论】:

  • 在访问系列对象时使用 .dt 访问器 - df['date'].dt.year
  • 除了上面的评论,为什么df['year'] = df['date'].apply(year) 会起作用? year 需要是一个已定义的对象或方法才能应用于每一行,这不是您需要 lambda 的原因
  • @NickilMaveli 谢谢。这个日期时间是特定的吗?如果我想访问另一个非日期时间对象的属性,我是使用 lambda 还是有快捷方式?
  • 一个非日期时间对象呢?完全是另一个对象——比如带有.foo这样的属性。
  • 是的,我的意思是是否有更通用的方式来访问不是datetime 特定的系列中对象的属性或方法。我猜是applylambda

标签: python pandas python-datetime


【解决方案1】:

您会很高兴知道有一整套功能可提供丰富的日期属性。您可以使用dt 访问器来获取许多日期时间属性。它只能用于 pandas 系列或日期类型的索引。

您可以使用dir(df['date'].dt) 查看所有可用属性。它们在下面打印出来。在您的情况下,只需使用df['date'].dt.year

'ceil',
 'date',
 'day',
 'dayofweek',
 'dayofyear',
 'days_in_month',
 'daysinmonth',
 'floor',
 'freq',
 'hour',
 'is_leap_year',
 'is_month_end',
 'is_month_start',
 'is_quarter_end',
 'is_quarter_start',
 'is_year_end',
 'is_year_start',
 'microsecond',
 'minute',
 'month',
 'nanosecond',
 'normalize',
 'quarter',
 'round',
 'second',
 'strftime',
 'time',
 'to_period',
 'to_pydatetime',
 'tz',
 'tz_convert',
 'tz_localize',
 'week',
 'weekday',
 'weekday_name',
 'weekofyear',
 'year'

【讨论】:

  • 谢谢特德。我希望得到一些不是 datetime 特定的东西,但可以解决我眼前的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 2013-02-28
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多