将函数应用于数据框; timestamp.dt

时间:2018-02-24 21:24:56

标签: python pandas

最终,我想计算df['start']中每个日期的当月最后一天的天数,并在'count'列中填入结果。

作为实现这一目标的第一步calendar.monthrange 方法获取(年,月)参数并返回(第一个工作日,天数)元组。

将函数应用于数据框或系列对象似乎存在一般错误。我想明白,为什么这不起作用。

import numpy as np
import pandas as pd
import calendar

def last_day(row):
    return calendar.monthrange(row['start'].dt.year, row['start'].dt.month)

这一行引发了一个AttributeError:“Timestamp对象没有属性'dt'”:

df['count'] = df.apply(last_day, axis=1)

这就是我的数据框架:

       start  count
0 2016-02-15    NaN
1 2016-02-20    NaN
2 2016-04-23    NaN

df.dtypes

start    datetime64[ns]
count           float64
dtype: object

2 个答案:

答案 0 :(得分:1)

删除.dt。访问某种矢量时通常需要这样做。但是当访问单个元素时,它已经是datetime对象:

代码:

def last_day(row):
    return calendar.monthrange(row['start'].year, row['start'].month)

为什么:

apply调用last_day并传递一个系列。

df['count'] = df.apply(last_day, axis=1)

last_day中,您可以选择系列中的单个元素:

row['start'].year

答案 1 :(得分:0)

我会这样做:

from pandas.tseries.offsets import MonthEnd

## sample data
d = pd.DataFrame({'start':['2016-02-15','2016-02-20','2016-04-23']})

## solution
d['start'] = pd.to_datetime(d['start'])
d['end'] = d['start'] + MonthEnd(1)
d['count'] = (d['start'] - d['end']) / np.timedelta64(-1, 'D')