python 创建具有可变行元素的二维数组/数据框

标签 python multidimensional-array dataframe time-series vectorization

我有一个多天的时间序列,其中每一天都有不同数量的数据点。生成示例数据帧如下:

n=10,20
init=datetime.datetime(2016, 7, 24, 0, 0)
df=pd.DataFrame()
for i in np.arange(n[0],n[1]):
    s =init+datetime.timedelta(days=i-10)
    df = pd.concat([df,pd.DataFrame(np.random.rand(i) ,index= pd.date_range(s, periods=i, freq='T') )])

给定一个像上面这样的数据框,我要创建另一个数据框/ndarray,它的索引=来自上面的 df 的日期(不适用于 ndarray 的情况)。并且values(rows) = 前2天的串联数据(由于使用此方法所有行将具有不同的长度,我们可以使用“NA”使它们相等)

我尝试这样做:

g = df.groupby(pd.TimeGrouper('D'))
d = {k: v for k, v in g}
k=d.keys()
k.sort()
X=pd.DataFrame(index=k)
for i in np.arange(1,len(k)):
    X.ix[i]=pd.concat([d[k[i]],d[k[i-1]]]).ix[:,0]

但这行不通。

最佳答案

不容易,循环是必要的:

import datetime as datetime
n= 1,5
np.random.seed(1)
init=datetime.datetime(2016, 7, 24, 0, 0)
df=pd.DataFrame()
for i in np.arange(n[0],n[1]):
    s = init+datetime.timedelta(days=int(i)-10)
    df = pd.concat([df,pd.DataFrame({"col": np.random.rand(i)}, 
                                     index= pd.date_range(s, periods=i, freq='T'))])
print (df)    
                          col
2016-07-15 00:00:00  0.417022
2016-07-16 00:00:00  0.720324
2016-07-16 00:01:00  0.000114
2016-07-17 00:00:00  0.302333
2016-07-17 00:01:00  0.146756
2016-07-17 00:02:00  0.092339
2016-07-18 00:00:00  0.186260
2016-07-18 00:01:00  0.345561
2016-07-18 00:02:00  0.396767
2016-07-18 00:03:00  0.538817

通过 numpy.unique 创建所有独特的日子:

u = np.unique(np.array(df.index.values.astype('<M8[D]')))
print (u)
['2016-07-15' '2016-07-16' '2016-07-17' '2016-07-18']

然后通过 datetimeindex partial string indexing 循环到 dict d 创建所有值:

d = {}
for i in u:
    dat = str(i)
    dat1 = str((i - pd.Timedelta('1D')))
    d[i] = pd.Series(df.loc[dat1:dat, 'col'].values)

print (d)
{numpy.datetime64('2016-07-18'): 0    0.302333
1    0.146756
2    0.092339
3    0.186260
4    0.345561
5    0.396767
6    0.538817
dtype: float64, numpy.datetime64('2016-07-15'): 0    0.417022
dtype: float64, numpy.datetime64('2016-07-16'): 0    0.417022
1    0.720324
2    0.000114
dtype: float64, numpy.datetime64('2016-07-17'): 0    0.720324
1    0.000114
2    0.302333
3    0.146756
4    0.092339
dtype: float64}

最后创建DataFrame.from_dict :

print (pd.DataFrame.from_dict(d, orient='index'))
                   0         1         2         3         4         5  \
2016-07-15  0.417022       NaN       NaN       NaN       NaN       NaN   
2016-07-16  0.417022  0.720324  0.000114       NaN       NaN       NaN   
2016-07-17  0.720324  0.000114  0.302333  0.146756  0.092339       NaN   
2016-07-18  0.302333  0.146756  0.092339  0.186260  0.345561  0.396767   

                   6  
2016-07-15       NaN  
2016-07-16       NaN  
2016-07-17       NaN  
2016-07-18  0.538817  

关于python 创建具有可变行元素的二维数组/数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40542595/

相关文章:

python - 使用pandas将txt文件转换为dataframe

python - 以 5 分钟为间隔对 DataFrame 进行分组

python - 在 Python 中查找常见数字

python - Django 午夜营业时间后 TimeField 比较错误

java - 在二维数组中的值的边界周围检测相同的值

php - 将带有点分隔键的平面数组转换为嵌套数组

python - OpenCV python 将多边形从一个图像复制到另一个图像

python - 根据特定列的条件将一组行的数据帧值分配给另一组行

C 将 "strings"的 2D 数组收集到数组中,然后将每个 2D 传递到 C98 函数中

dataframe - 计算数据框 Julia 中每列的缺失值