我有一个数据帧,我想分成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() + ti
和s.min() + 2*ti
之间的所有行等等。
有人能建议一个简单的方法来实现这一目标吗?如果以某种方式我可以将所有日期转换为自纪元以来的秒数,那么我可以做thisgroup = floor(thisdate/ti)
之类的事情。
是否有一种简单的“pythonic”或“panda-ista”方式来做到这一点?
非常感谢(圣诞快乐!),
罗宾
答案 0 :(得分:1)
您可以使用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]]
答案 1 :(得分:0)
答案如下:
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( ))))