您好dataframe
包含多个相同ID的行。其中一列是日期(按升序排列)。我想计算第一个条目和最后一个条目之间的日期差异。
我是通过实例化pandas构造函数来实现的,如下所示:
g = df.groupby('ID')
print(pd.DataFrame({'first':g.Date.nth(0), 'last':g.Date.nth(-1)}))
第一个值是正确的,但是,最后一个值远不正确。
例如,对于特定ID,first date
为2000-05-08
,last date
为8/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,这样我最终可以计算出日期差异。
答案 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