我有时间序列数据,如下所示
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()
问题是一周的日子似乎很混乱,正如人们从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')
答案 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()
您也可以使用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')
])