在仅绘制年度标签的情况下每月统计总价值

时间:2018-10-11 22:32:57

标签: python python-3.x pandas matplotlib pandas-groupby

我有以下DataFrame:

                         H     T       date
date                                       
1990-08-26 11:30:00   38.0  11.6 1990-08-26
1990-08-26 11:30:00   63.0  11.3 1990-08-26
1990-08-26 11:30:00   87.0  10.9 1990-08-26
1990-08-26 11:30:00  111.0  10.6 1990-08-26
1990-08-26 11:30:00  134.0  10.4 1990-08-26
1990-08-26 11:30:00  154.0  10.1 1990-08-26
1990-08-26 11:30:00  178.0   9.9 1990-08-26
1990-08-26 11:30:00  205.0   9.6 1990-08-26
1990-08-26 11:30:00  233.0   9.4 1990-08-26
1990-08-26 11:30:00  260.0   9.2 1990-08-26

其中T是温度,H是高度(以米为单位)。 我想计算每个月(每年)有多少天,然后将其作为条形图进行计算。 所以我要做的是以下代码(下面的代码)

df = pd.read_csv('/radiosonde_Iceland_analysis.   
/data/H_T_series_1991_2016',sep = "\t")
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
df['date'] = df.index.date
df['date'] = pd.to_datetime(df['date'], errors='coerce')
print(df.head(10))
  df_count=df.groupby([df.date.dt.year,df.date.dt.month,df.date.dt.day]).count()
df_count=df_count[df_count['date']>1991]
print(df_count)
fig,ax = plt.subplots()

plt.xticks(rotation=90)
ax.set_xlabel('Year')
ax.set_ylabel('Nr of observations(vertical points) per   
year')   
df_count['H'].plot(kind='bar',stacked=True,width=0.6,colormap='Paired',alpha=0.7)
plt.savefig('count_heights_ave_1991_2016.png',dpi=200)
plt.show()

首先,如何获得每个月T的出现次数总数?我得到的是这样的:

1992 1 2 2113 2111 2113           4 2148 2146 2148           5 2028 2027 2028           12 2044 2042 2044           19 2361 2361 2361           21 2061 2061 2061           22 2014 2014 2014           23 2008 2008 2008           24 2161 2161 2161           27 2024 2023 2024           29 2374 2373 2374      4 3 2025 2024 2025 1995 7 11 2009 2009 2009 2006 1 1 4593 4593 4593           2 4870 4870 4870           3 4249 4249 4249           4 4761 4761 4761           5 4889 4889 4889           6 2380 2380 2380           7 4504 4504 4504           8 4828 4828 4828           9 4933 4933 4933 但我想要每月总计。

第二,我希望在x轴标签上显示年份,但是由于索引定义为yy-mm-dd-hh等,因此我将所有标签塞满了该位置(如附图所示-随您所见全黑)可以看到)。 您能告诉我正确绘制这些轴的方法是什么,并且仅在年份(而不是月份)上打勾。

enter image description here

1 个答案:

答案 0 :(得分:0)

一些测试数据:

import numpy as np
import pandas as pd

np.random.seed(444)

start = '1990-01-01'
end = '2017-12-31'
idx = pd.date_range(start, end, freq='30min')

# different number of repeats per 30-min tick
rpt = np.random.randint(1, 5, size=idx.size)
idx = np.repeat(idx, rpt)
df = pd.DataFrame({'T': np.random.randn(idx.size)}, index=idx)
df['date'] = df.index.date
df.index.name = 'date'

摘要:

>>> df.head()
                            T        date
date                                     
1990-01-01 00:00:00 -0.335715  1990-01-01
1990-01-01 00:00:00  0.867022  1990-01-01
1990-01-01 00:00:00 -0.503262  1990-01-01
1990-01-01 00:30:00 -0.543694  1990-01-01
1990-01-01 01:00:00  2.067549  1990-01-01

您的问题:

  

首先,如何获得每个月T的总数?

我假设您正在寻找每个年,月组合的出现次数。您可以为此使用.groupby()

>>> counts = df.groupby(by=[df.index.year, df.index.month])['T'].count()

>>> counts.head()
date  date
1990  1       3750
      2       3357
      3       3626
      4       3539
      5       3790
Name: T, dtype: int64

>>> counts.tail()
date  date
2017  8       3711
      9       3611
      10      3649
      11      3689
      12      3557
Name: T, dtype: int64

请注意,.count()是非空观测值的数量。

  

正确绘制那些轴并且仅在年份(而不是月份)上打勾的方法是什么?

这很棘手,尽管我的可能不是最聪明的解决方案。 (我认为您也应该可以使用MonthFormatter。)

allyrs = counts.index.get_level_values(0)
uyrs = allyrs.unique()
mask = np.zeros_like(uyrs)
mask[1:] = np.where(allyrs[1:] != allyrs[:-1])[0]

counts.plot(kind='bar')
plt.xticks(mask, yrs)
plt.title('Obs. Count by Year/Month')
plt.xlabel('Year-Month')
plt.ylabel('Count')

结果:

enter image description here