【问题标题】:How to extract the first and last value from a data sequence based on a column value?如何根据列值从数据序列中提取第一个和最后一个值?
【发布时间】:2021-11-08 17:38:22
【问题描述】:

我有一个时间序列数据集,可以使用以下代码创建。

idx = pd.date_range("2018-01-01", periods=100, freq="H")
ts = pd.Series(idx)
dft = pd.DataFrame(ts,columns=["date"])
dft["data"] = ""

dft["data"][0:5]= "a"
dft["data"][5:15]= "b"
dft["data"][15:20]= "c"
dft["data"][20:30]= "d"
dft["data"][30:40]= "a"
dft["data"][40:70]= "c"
dft["data"][70:85]= "b"
dft["data"][85:len(dft)]= "c"

在数据列中,唯一值是a,b,c,d。这些值在不同的时间窗口中按顺序重复。 我想捕获该时间窗口的第一个和最后一个值。我该怎么做

【问题讨论】:

  • 我想你首先需要pandas.groupby,然后按日期分组
  • @iamwhoiam : 提供输出 .. 其他用户会更容易看到您的需求
  • @codeholic24 如您所见,有一个公认的解决方案

标签: python pandas time-series


【解决方案1】:

使用shift 为您不断变化的值计算一个分组器以比较连续的行,然后使用groupby+agg 获得每组的最小值/最大值:

group = dft.data.ne(dft.data.shift()).cumsum()
dft.groupby(group)['date'].agg(['min', 'max'])

输出:

                     min                 max
data                                        
1    2018-01-01 00:00:00 2018-01-01 04:00:00
2    2018-01-01 05:00:00 2018-01-01 14:00:00
3    2018-01-01 15:00:00 2018-01-01 19:00:00
4    2018-01-01 20:00:00 2018-01-02 05:00:00
5    2018-01-02 06:00:00 2018-01-02 15:00:00
6    2018-01-02 16:00:00 2018-01-03 21:00:00
7    2018-01-03 22:00:00 2018-01-04 12:00:00
8    2018-01-04 13:00:00 2018-01-05 03:00:00

编辑。结合原始数据:

dft.groupby(group).agg({'data': 'first', 'date': ['min', 'max']})

输出:

      data                date                    
     first                 min                 max
data                                              
1        a 2018-01-01 00:00:00 2018-01-01 04:00:00
2        b 2018-01-01 05:00:00 2018-01-01 14:00:00
3        c 2018-01-01 15:00:00 2018-01-01 19:00:00
4        d 2018-01-01 20:00:00 2018-01-02 05:00:00
5        a 2018-01-02 06:00:00 2018-01-02 15:00:00
6        c 2018-01-02 16:00:00 2018-01-03 21:00:00
7        b 2018-01-03 22:00:00 2018-01-04 12:00:00
8        c 2018-01-04 13:00:00 2018-01-05 03:00:00

【讨论】:

  • 这几乎是对的。但缺少数据列( a-d )中的原始值
  • 你想保持原来的形状?
  • 我想将真实值保留到数据列
  • 我明白了,那你可能想要dft.groupby(group).agg({'data': 'first', 'date': ['min', 'max']})
  • 谢谢。这就是解决方案。您可以将其添加到您的解决方案中。我接受它作为主要答案
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2021-09-22
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多