【问题标题】:Pandas get first and last value of column from group熊猫从组中获取列的第一个和最后一个值
【发布时间】:2018-08-12 14:41:39
【问题描述】:

您好,我有 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 的结果为:2000 年 5 月 8 日和 2010 年 8 月 21 日,以便最终计算出日期差异。

【问题讨论】:

  • 你能提供一个显示错误的示例数据集吗?
  • 欢迎来到 SO。请提供 minimal reproducible example
  • @ScottBoston 感谢您的评论。请查看我的编辑。

标签: python pandas date dataframe


【解决方案1】:

您可以一步完成,确保您的“日期”列是 dtype 日期时间,

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'])

【讨论】:

  • 感谢您的回答。排序后的最后一个日期似乎是正确的。
【解决方案2】:

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

import datetime

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

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

【讨论】:

  • 感谢您的回答。我为什么要解析日期呢?它们的格式不一样吗?
  • 使用 datetime 解析日期也可以让您找出差异。我并不是说你绝对必须使用日期时间,我只是说使用这个库解析你所有的日期可以保持一致,你可以很容易地通过从另一个中减去一个日期来找出日期之间的差异。
  • 是的,我完全同意。我的问题是获取最后一个比较日期。
  • 对不起,我以不同的方式思考这个问题,没有回答你的主要问题。要查找第一个和最后一个日期,您可以使用(已排序或未排序)已解析日期列表的最小值和最大值来获取您的日期。
  • 别担心我的朋友!感谢您的时间。是的,我设法得到了我想要的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2021-05-19
  • 2023-03-13
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多