当前位置: 首页 > 面试题库 >

如何基于pandas时间序列中的5分钟间隔创建组ID?

傅明知
2023-03-14
问题内容

我有一个时序数据帧,df看起来像这样(时间序列 发生在同一天,但跨越了不同的时间:

                                id               val 
 time                    
2014-04-03 16:01:53             23              14389      
2014-04-03 16:01:54             28              14391             
2014-04-03 16:05:55             24              14393             
2014-04-03 16:06:25             23              14395             
2014-04-03 16:07:01             23              14395             
2014-04-03 16:10:09             23              14395             
2014-04-03 16:10:23             26              14397             
2014-04-03 16:10:57             26              14397             
2014-04-03 16:11:10             26              14397

从开始,我需要每5分钟创建一个小组16:00:00。这是所有与该范围内的行16:00:0016:05:00,其新列的值period是1(行的每个组内的编号是不规则的,所以我不能简单地切断基团)

最终,数据应如下所示:

                                id               val           period 
time            
2014-04-03 16:01:53             23              14389             1
2014-04-03 16:01:54             28              14391             1
2014-04-03 16:05:55             24              14393             2
2014-04-03 16:06:25             23              14395             2
2014-04-03 16:07:01             23              14395             2
2014-04-03 16:10:09             23              14395             3
2014-04-03 16:10:23             26              14397             3
2014-04-03 16:10:57             26              14397             3
2014-04-03 16:11:10             26              14397             3

目的是执行一些groupby操作,但是我需要做的操作未包含在pd.resample(how=' ')方法中。因此,我必须创建一period列以标识每个组,然后执行df.groupby('period').apply(myfunc)

任何帮助或评论都将受到高度赞赏。

谢谢!


问题答案:

您可以在中使用该TimeGrouper功能groupy/apply。使用a,TimeGrouper您无需创建期间列。我知道您不是要计算平均值,但我将以它为例:

>>> df.groupby(pd.TimeGrouper('5Min'))['val'].mean()

time
2014-04-03 16:00:00    14390.000000
2014-04-03 16:05:00    14394.333333
2014-04-03 16:10:00    14396.500000

或一个带有显式的示例apply

>>> df.groupby(pd.TimeGrouper('5Min'))['val'].apply(lambda x: len(x) > 3)

time
2014-04-03 16:00:00    False
2014-04-03 16:05:00    False
2014-04-03 16:10:00     True

Doctstring用于TimeGrouper

Docstring for resample:class TimeGrouper@21

TimeGrouper(self, freq = 'Min', closed = None, label = None,
how = 'mean', nperiods = None, axis = 0, fill_method = None,
limit = None, loffset = None, kind = None, convention = None, base = 0,
**kwargs)

Custom groupby class for time-interval grouping

Parameters
----------
freq : pandas date offset or offset alias for identifying bin edges
closed : closed end of interval; left or right
label : interval boundary to use for labeling; left or right
nperiods : optional, integer
convention : {'start', 'end', 'e', 's'}
    If axis is PeriodIndex

Notes
-----
Use begin, end, nperiods to generate intervals that cannot be derived
directly from the associated object

编辑

我不知道创建周期列的一种优雅方法,但是以下方法可以工作:

>>> new = df.groupby(pd.TimeGrouper('5Min'),as_index=False).apply(lambda x: x['val'])
>>> df['period'] = new.index.get_level_values(0)
>>> df

                     id    val  period
time
2014-04-03 16:01:53  23  14389       0
2014-04-03 16:01:54  28  14391       0 
2014-04-03 16:05:55  24  14393       1
2014-04-03 16:06:25  23  14395       1
2014-04-03 16:07:01  23  14395       1
2014-04-03 16:10:09  23  14395       2
2014-04-03 16:10:23  26  14397       2
2014-04-03 16:10:57  26  14397       2
2014-04-03 16:11:10  26  14397       2

之所以起作用,是因为groupby这里的as_index =
False实际返回了您想要的期间列作为多索引的一部分,而我只是抓住了多索引的那一部分并分配给原始数据帧中的新列。您可以在apply中做任何事情,我只需要索引:

>>> new

   time
0  2014-04-03 16:01:53    14389
   2014-04-03 16:01:54    14391
1  2014-04-03 16:05:55    14393
   2014-04-03 16:06:25    14395
   2014-04-03 16:07:01    14395
2  2014-04-03 16:10:09    14395
   2014-04-03 16:10:23    14397
   2014-04-03 16:10:57    14397
   2014-04-03 16:11:10    14397

>>>  new.index.get_level_values(0)

Int64Index([0, 0, 1, 1, 1, 2, 2, 2, 2], dtype='int64')


 类似资料:
  • Pandas 在对频率转换进行重新采样时拥有简单、强大且高效的功能(如将按秒采样的数据转换为按5分钟为单位进行采样的数据)。这种操作在金融领域非常常见。具体参考:时间序列。 In [108]: rng = pd.date_range('1/1/2012', periods=100, freq='S') In [109]: ts = pd.Series(np.random.randint(0, 50

  • 试图找出一种方法来分割pandas/numpy矩阵中非连续和非等长的行,以便将这些值设置为公共值。有没有人想出一个优雅的解决方案? 我要寻找的是一种基于y行有效选择不同长度x切片的方法

  • 问题内容: 我正在尝试生成时间间隔数组。例如: 它应该在祖鲁时间直到每天晚上9点创建上述元素。 也应该为下一个和后一天生成元素 起始时间从7:00 am-Ed time 9:00 pm,如果current_time> start_time,则生成15分钟的时间间隔数组,直到9 pm。然后为第二天和第二天生成2。间隔应该是这样的7:00、7:15 ..不在7:12、8:32 问题答案: 这是供您使用

  • 问题内容: 我需要将表分组为15分钟间隔。我可以这样做: 但是要在图表中显示返回的数据,我还需要插入没有任何数据且当前未出现在我的select语句中的间隔。我该如何插入这些? 问题答案: 用15分钟的增量创建一个带有所有可能时间戳的表,然后从该表向上面的查询进行LEFT JOIN。 如果您知道图表始终涵盖24小时,则只需创建一个数字为0-95的表格,然后为每个条目将其添加到图表的开始时间。

  • 我需要将时间序列数据显示为分层条形图。JFreeChart有可能吗?任何建议都会很有帮助。 数据将是:(TS,X1,X2)的列表,其中我必须为给定的时间戳(TS)绘制X1,X2基本上将作为X1的给定值的标签。 编辑:同样,对于相同的TS,可能存在不同的X1值。其思想是将所有这些X1值表示为针对相同TS的分层条。 下面是我想要的一个例子: (所以我将在X轴上有TS而不是类别)

  • 问题内容: 我有一个这样的dataFrame,我想每60分钟进行一次分组,然后从06:30开始分组。 我在用: 我得到这个分组: 但我正在寻找这个结果: 我如何告诉该功能以6小时30分开始以一小时为间隔进行分组? 如果 .groupby(pd.TimeGrouper(freq =‘60Min’)) 无法完成此 操作 ,最好的方法是怎么做? 致敬并非常感谢 问题答案: 使用会同中的参数。 指定将使时