Pandas从组

时间:2018-03-05 00:43:46

标签: python pandas date dataframe

您好dataframe包含多个相同ID的行。其中一列是日期(按升序排列)。我想计算第一个条目和最后一个条目之间的日期差异。

我是通过实例化pandas构造函数来实现的,如下所示:

g = df.groupby('ID')

print(pd.DataFrame({'first':g.Date.nth(0), 'last':g.Date.nth(-1)}))

第一个值是正确的,但是,最后一个值远不正确。

例如,对于特定ID,first date2000-05-08last date8/21/2010。输出的结果是:

               first       last
ID                         
31965.0        2000-05-08  2002-12-29

2002-12-29位于中间位置。

示例数据:

ID  Date
31965   5/8/2000
31965   5/10/2000
31965   5/18/2000
31965   5/22/2000
31965   5/23/2000
31965   5/25/2000
31965   5/30/2000
31965   6/7/2000
31965   6/8/2000
31965   6/11/2000
31965   6/13/2000
.....
31965   4/11/2009
31965   5/9/2009
31965   5/16/2009
31965   5/23/2009
31965   2/5/2010
31965   2/26/2010
31965   3/13/2010
31965   4/10/2010
31965   8/21/2010

我希望ID 31965的结果为:5/8/2000和8/21/2010,这样我最终可以计算出日期差异。

2 个答案:

答案 0 :(得分:5)

您可以一步完成此操作,请确保“日期”列为dtype datetime,

df['Date'] = pd.to_datetime(df['Date'])

df.groupby('ID')['Date'].agg(['first','last'])

现在,我怀疑您的数据可能没有正确排序,但如果您仍想要最早和最新的日期,那么您可以这样做:

df.groupby('ID')['Date'].agg(['min','max']).rename(columns={'min':'first','max':'last'})

或者您可以使用sort_values:

df.sort_values('Date').groupby('ID')['Date'].agg(['first','last'])

答案 1 :(得分:1)

您可能需要以这种方式解析最后一个日期:

import datetime

def parser(x):
    return datetime.strptime(str(x), '%m/%d/%Y')

在这里,您将日期字符串提供给函数,函数返回一个已解析的日期。您可以类似地解析第一个日期,并生成与上一个日期一致的内容;您可能需要在区域%m/%d/%Y中更改的唯一内容。那应该可以解决你的问题。阅读此页面以获取更多信息:https://docs.python.org/2/library/datetime.html