我有一个时序数据帧,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:00
向16: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’)) 无法完成此 操作 ,最好的方法是怎么做? 致敬并非常感谢 问题答案: 使用会同中的参数。 指定将使时