【问题标题】:Calculating the difference in dates in a Pandas GroupBy object计算 Pandas GroupBy 对象中的日期差异
【发布时间】:2015-08-23 07:57:15
【问题描述】:

我有一个格式如下的 Pandas DataFrame:

In [0]: df
Out[0]: 
       col1  col2       date
 0     1     1          2015-01-01
 1     1     2          2015-01-09
 2     1     3          2015-01-10
 3     2     1          2015-02-10
 4     2     2          2015-02-10
 5     2     3          2015-02-25

In [1]: df.dtypes
Out[1]:
 col1             int64
 col2             int64
 date    datetime64[ns]
 dtype: object

我们想要找到col2 的值对应于日期的最大差异(在按日期排序的组中的连续元素之间),按col1 分组。假设没有大小为 1 的组。

期望的输出

In [2]: output
Out[2]:
col1   col2
1      1         # This is because the difference between 2015-01-09 and 2015-01-01 is the greatest
2      2         # This is because the difference between 2015-02-25 and 2015-02-10 is the greatest

真实的df 有很多col1 的值,我们需要通过groupby 来进行计算。这可以通过对以下应用函数来实现吗?请注意,日期已经按升序排列。

gb = df.groupby(col1)
gb.apply(right_maximum_date_difference)

【问题讨论】:

  • 所以,正如我在回答中指出的那样,我认为您的问题有误:“2015-01-09 - 2015-01-01”是 not最棒的。
  • 2015-01-09 和 2015-01-01 相差 8 天。 2015-01-10 和 2015-01-09 之间的差异是 1 天。在这种情况下,我有兴趣捕获对应于 2015-01-01 日期的 col2 的值,因为差异最大。
  • 哦,你的意思是在同一个 groupby 中的前一行。我不得不说这个问题非常不清楚。此外,它是大小为 1 的未定义组。
  • 此操作仅适用于原始数据框中大于 2 的组。
  • 好吧,更新了问题和答案以反映这一点。我必须说我认为措辞可以改进,尤其是。因为未明确表示长度 = 1 组的未定义结果。

标签: python pandas time-series


【解决方案1】:

这几乎是您的数据框(我避免复制日期):

df = pd.DataFrame({
    'col1': [1, 1, 1, 2, 2, 2],
    'col2': [1, 2, 3, 1, 2, 3],
    'date': [1, 9, 10, 10, 10, 25]
})

有了这个,定义:

def max_diff_date(g):
    g = g.sort(columns=['date'])
    return g.col2.ix[(g.date.ix[1: ] - g.date.shift(1)).argmax() - 1]

你有:

>> df.groupby(df.col1).apply(max_diff_date)
col1
1    1
2    2
dtype: int64

【讨论】:

  • 您编写的lambda 函数将找到最大日期 并返回与该日期对应的col2 的值。这不是我们想要的(如果我想要的话,我可以在每个 groupby 中查找最后一行,因为日期已经排序)。 我需要在行之间进行操作来找出日期的差异,并取其中的最大值来找到col2 的值。
  • 我之前的评论已经过时了,代码已经改了。阿米,我想你做到了!非常感谢!
  • 阿米,我很难让它适用于 DateTime 类型。你能帮我吗?它适用于整数,但这对我来说只是一步。
  • @invoker 是的,我去看看。
  • @invoker 我在下面 JoeCondron 的答案的 DataFrame 上运行了完全相同的代码,它的工作原理完全相同。所以问题出在你的 DataFrame 类型和那个类型之间。这是一个建议:就此提出一个新问题。这个网站真的不是为 cmets 中的对话而构建的。
【解决方案2】:

我会尝试一种稍微不同的方法:旋转表格,以便在 col2 中的每个值都有一个列,其中包含日期和 col1 的值作为索引。然后您可以使用.diff 方法来获取连续单元格之间的差异。如果有重复的col1col2 对,这可能不起作用,这在问题中并不清楚。

df = pd.DataFrame({'col1': [1, 1, 1, 2, 2, 2],
          'col2': [1, 2, 3, 1, 2, 3],
          'date': pd.to_datetime(['2015-01-01', '2015-01-09', '2015-01-10', 
                                  '2015-02-10', '2015-02-10', '2015-02-25'])})
p = df.pivot(columns='col1', index='col2', values='date')
p
    col1    1   2
col2        
1   2015-01-01  2015-02-10
2   2015-01-09  2015-02-10
3   2015-01-10  2015-02-25

p.diff().shift(-1).idxmax() 

col1
1       1
2       2

.shift(-1) 处理您想要两个连续日期中差异最大的第一个日期的事实。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多