繁体   English   中英

将数据帧拆分为n个相等的时间间隔,分组为groupby,其中时间间隔为(time.max() - time.min())/ n

[英]Split dataframe into n equal time intervals, to groupby, where time interval is (time.max() - time.min())/ n

我有一个数据帧,我想分成5个块(更常见的是n块),这样我就可以在块上应用groupby。

我希望块具有相等的时间间隔,但通常每个组可能包含不同数量的记录。

我们来调用这些数据

s = pd.Series(pd.date_range('2012-1-1', periods=100, freq='D'))

和时间间隔ti = (s.max() - s.min())/n

所以第一个块应该包括日期在s.min()s.min() + ti之间的所有行,第二个,所有行的日期在s.min() + tis.min() + 2*ti

有谁能建议一个简单的方法来实现这一目标? 如果以某种方式我可以将所有日期转换为自纪元以来的秒数,那么我可以做类似thisgroup = floor(thisdate/ti)事情。

是否有一种简单的“pythonic”或“panda-ista”方式来做到这一点?

非常感谢(圣诞快乐!),

知更鸟

你可以使用numpy.array_split

>>> import pandas as pd
>>> import numpy as np
>>> s = pd.Series(pd.date_range('2012-1-1', periods=10, freq='D'))

>>> np.array_split(s, 5)
[0   2012-01-01 00:00:00
1   2012-01-02 00:00:00
dtype: datetime64[ns], 2   2012-01-03 00:00:00
3   2012-01-04 00:00:00
dtype: datetime64[ns], 4   2012-01-05 00:00:00
5   2012-01-06 00:00:00
dtype: datetime64[ns], 6   2012-01-07 00:00:00
7   2012-01-08 00:00:00
dtype: datetime64[ns], 8   2012-01-09 00:00:00
9   2012-01-10 00:00:00
dtype: datetime64[ns]]

>>> np.array_split(s, 2)
[0   2012-01-01 00:00:00
1   2012-01-02 00:00:00
2   2012-01-03 00:00:00
3   2012-01-04 00:00:00
4   2012-01-05 00:00:00
dtype: datetime64[ns], 5   2012-01-06 00:00:00
6   2012-01-07 00:00:00
7   2012-01-08 00:00:00
8   2012-01-09 00:00:00
9   2012-01-10 00:00:00
dtype: datetime64[ns]]

答案如下:

s = pd.DataFrame(pd.date_range('2012-1-1', periods=20, freq='D'), columns=["date"])

n = 5

s["date"] = np.int64(s)  #This step may not be needed in future pandas releases
s["bin"] = np.floor((n-0.001)*(s["date"] - s["date"].min( )) /((s["date"].max( ) - s["date"].min( ))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM