将小时数据管理为全年Pandas

时间:2017-05-13 09:26:55

标签: python pandas matplotlib

背景

我上传的数据links是监控站全年的con的时间序列数据。数据格式如下所示:

enter image description here

我的目标

为了研究样本的时间模式,我想绘制每月样本的变化。

就像我从plot.ly下载的下图。每个框表示原始数据的每日平均样本。每月平均值由线条概述。

enter image description here

使用groupby函数或pd.pivot函数,我可以轻松获取某些月份或每日数据的子集。

但我发现生成a bunch of dataframes很难。每个应包含特定月份的每日平均数据。

通过预先定义12个空数据帧,我可以生成12个满足我需求的数据帧。 但是有没有任何巧妙的方法来划分原始数据帧,然后根据用户定义的条件生成多个数据帧。

修改

受到@alexis答案的启发。我试图用这些代码实现我的目标。它对我有用。

## PM is the original dataset with date, hour, and values.
position  = np.arange(1,13,1)
monthDict = {1:'Jan', 2:'Feb', 3:'Mar', 4:'Apr', 5:'May', 6:'Jun', 
            7:'Jul', 8:'Aug', 9:'Sep', 10:'Oct', 11:'Nov', 12:'Dec'}
pm['label'] = np.nan

for i in range(0,len(pm),1):
    pm['label'].iloc[i] = monthDict.get(int(pm['date'].str[4:6].iloc[i])) 

## Create an empty dataframe for containing the daily mean value.
df = pd.DataFrame(np.nan, index=np.arange(0,31,1), columns=['A'])
for i,t in enumerate(pm.label.unique()):
    df[str(t)] = np.nan
df = df.drop(['A'],1)    

mean_ = []
for i in range(0,len(pm.label.unique()),1):
    month_data = pm.groupby(['label']).get_group(pm.label.unique()[i]).groupby(pm['date'].str[6:8])['pm25'].mean()
    mean_.append(month_data.mean())
    for j in range(0,len(month_data),1):
        df[pm.label.unique()[i]].iloc[j] = month_data[j]

#### PLOT 
fig = plt.figure(figsize=(12,5))
ax = plt.subplot()
bp  = ax.boxplot( df.dropna().values, patch_artist=True, showfliers=False)
mo_me = plt.plot(position,mean_, marker = 'o', color ='k',markersize =6, label = 'Monthly Mean', lw = 1.5,zorder =3)

cs = ['#9BC4E1','k']
for box in bp['boxes']:
    box.set(color = 'b', alpha = 1)
    box.set(facecolor = cs[0], alpha = 1)
for whisker in bp['whiskers']:
    whisker.set(color=cs[1], linewidth=1,linestyle = '-')    
for cap in bp['caps']:
    cap.set(color=cs[1], linewidth=1)   
for median in bp['medians']:
    median.set(color=cs[1], linewidth=1.5)

ax.set_xticklabels(pm.label.unique(), fontsize = 14)    
# ax.set_yticklabels(ax.get_yticks(), fontsize = 12)
for label in ax.yaxis.get_ticklabels()[::2]:
    label.set_visible(False)   
for tick in ax.yaxis.get_major_ticks():
    tick.label.set_fontsize(14) 


plt.ylabel('Concentration', fontsize = 16, labelpad =14)    
plt.xlabel('Month', fontsize = 16, labelpad =14)    
plt.legend(fontsize = 14, frameon = False)
ax.set_ylim(0.0, 178)
plt.grid()
plt.show()

这是我的输出数字。

enter image description here

  

有关我的数据管理或可视化代码的任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

不要生成12个数据帧。不要将数据拆分成多个类似的变量,而是添加一个列,指示每行应属于哪个组。这是数据库表,数据框等的标准做法(有充分理由)。

在数据集上使用groupby按月对数据进行分组,然后在生成的apply()对象上使用DataFrameGroupBy来限制您想要的任何分析(例如,每个组的平均值)。这也可以很容易地将月度结果绘制在一起。

您没有提供任何代码,因此很难具体而言。显示按月分组数据的方式以及您希望对月度数据框执行的操作,我将向您展示如何通过groupby对象将其限制为每月。