每周在相同的地块上叠加时间序列数据 - 修复我的MultiIndex?

时间:2017-01-19 22:29:06

标签: python python-2.7 pandas matplotlib

我有时间序列数据,如下所示

In[118]: df
Out[118]: 
                               Value
Date                                
2016-09-15 00:00:00.000000  0.446219
2016-09-15 00:10:07.958815  0.148335
2016-09-15 00:29:34.960880  0.300437
2016-09-15 00:40:38.262082  0.187721
2016-09-15 00:55:57.910574  0.108615
2016-09-15 01:15:29.595385  0.735744
2016-09-15 01:33:15.055574  0.167966
2016-09-15 01:47:47.570397  0.083261
                             ...
2017-01-19 14:09:11.347323  0.140574
2017-01-19 14:26:05.349305  0.122632
2017-01-19 14:38:02.607448  0.530922
2017-01-19 14:54:38.043359  0.983858
2017-01-19 15:06:36.638637  0.723228
2017-01-19 15:18:43.197898  0.380847
2017-01-19 15:33:03.925526  0.209378
2017-01-19 15:52:12.064726  0.969853
2017-01-19 16:03:07.974073  0.932526

[12175 rows x 1 columns]

我试图在同一个情节上绘制这个时间序列的每周,x轴跨越一周的日子。在前一个问题的帮助下,我现在可以接近通过构建如下的MultiIndex来完成此任务。 (这里我只绘制了4周的简单

pl_df = df.copy()
pl_df.index = [df.index.weekday_name, df.index.time, df.index.to_period('w')]
ax = pl_df.Value.unstack().interpolate().iloc[:, :2].plot()
ax.figure.autofmt_xdate()

enter image description here

问题是一周的日子似乎很混乱,正如人们从x轴看到的那样。我试图使用一个简单的列表理解来重新索引我的DataFrame,并使用正确的"星期几"为了使x轴显得正确,但这似乎没有任何影响。由于我对输出的解释,我甚至不能完全确定MultiIndex是否正确。我根本不确定索引的排序是怎么回事。

要生成类似的DataFrame,您可以运行以下

import datetime 
import numpy as np
import pandas as pd

start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()

dts = []
cur_date = start_date
while cur_date < end_date:
    dts.append((cur_date, np.random.rand()))
    cur_date = cur_date + datetime.timedelta(minutes=np.random.uniform(10, 20))


df = pd.DataFrame(dts, columns=['Date', 'Value']).set_index('Date')

1 个答案:

答案 0 :(得分:4)

您可以使用有序的CategoricalIndex

pl_df = df.copy()
cats = ['Monday', 'Tuesday', 'Wednesday', 'Thursday' ,'Friday' , 'Saturday','Sunday']

pl_df.index = [
    pd.CategoricalIndex(df.index.weekday_name, ordered=True, categories=cats), 
    df.index.time, 
    df.index.to_period('w')
]
ax = pl_df.Value.unstack().interpolate().iloc[:, :2].plot()
ax.figure.autofmt_xdate()

graph

您也可以使用MultiIndex.from_arrays

pl_df.index = pd.MultiIndex.from_arrays([
    pd.CategoricalIndex(df.index.weekday_name, ordered=True, categories=cats), 
    df.index.time, 
    df.index.to_period('w')
])