Python 使用pandas将月度数据表转换为季节性时间序列
我有一些表格格式的数据,行是年,列是月。我想将其转换为熊猫的时间序列格式,然后按季节平均值对数据进行分组(我特别想将冬季定义为11月至3月,并放弃所有其他内容)。下面是我的代码,它将数据读入表格格式,这样您就可以看到发生了什么:Python 使用pandas将月度数据表转换为季节性时间序列,python,pandas,Python,Pandas,我有一些表格格式的数据,行是年,列是月。我想将其转换为熊猫的时间序列格式,然后按季节平均值对数据进行分组(我特别想将冬季定义为11月至3月,并放弃所有其他内容)。下面是我的代码,它将数据读入表格格式,这样您就可以看到发生了什么: 将熊猫作为pd导入 页眉=['1月'、'2月'、'3月'、'4月'、'5月'、'6月'、'7月'、'8月'、'9月'、'10月'、'11月'、'12月'] df=pd.read\u csv('https://www.esrl.noaa.gov/psd/gcos_wgsp
将熊猫作为pd导入
页眉=['1月'、'2月'、'3月'、'4月'、'5月'、'6月'、'7月'、'8月'、'9月'、'10月'、'11月'、'12月']
df=pd.read\u csv('https://www.esrl.noaa.gov/psd/gcos_wgsp/Timeseries/Data/nino34.long.anom.data',
分隔符='\s+',标头=0,名称=标头,skiprows=1,索引列=0)
df=df.drop(df.tail(7.index))
df
我要得到的结果是每个冬季11月至3月的平均值的时间序列(例如,2018年11月、2018年12月、2019年1月、2019年2月和2019年3月的平均值)。我猜这个过程包括首先将这些数据排序成一个时间序列(我不确定如何做),然后按季节分组(11月至3月),然后删除其他月份 给出如图所示的数据
- 年份是指数
- 查看以指定窗口
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
导入seaborn作为sns
#重置索引
df.reset_索引(原地=真)
#将列重命名为year
rename(列={'index':'year'},inplace=True)
#将df转换为长格式
df2=df.melt(id_vars='year',var_name='month')
#创建datatime列并将其设置为索引
df2['date']=pd.to_datetime(df2['year'].astype(str)+'-'+df2['month']))
df2.set_索引('date',inplace=True)
#定义冬季数据帧
冬季=df2[df2['month'].isin(['Nov','Dec','Jan','Feb','Mar'])。复制()
#对索引排序
winter.sort_索引(就地=真)
冬季数据帧
年-月值
日期
1871-01-01 1871年1月-0.25日
1871-02-01 1871年2月-0.58
1871-03-01 1871年3月-0.43
1871-11-01 1871年11月-0.31日
1871-12-01 1871年12月-0.58日
1872-01-01 1872年1月-0.72
1872-02-01 1872年2月-0.62
1872-03-01 1872年3月-0.50
1872-11-01 1872年11月-0.79
1872-12-01 1872年12月-0.88
1873-01-01 1873年1月-0.78
1873-02-01 1873年2月1日
1873-03-01 1873年3月1日至31日
1873-11-01 1873年11月-0.77
1873-12-01 1873年12月-0.70
1874-01-01 1874年1月-0.93
1874-02-01 1874年2月-2006年1月
1874-03-01 1874年3月1日下午1时40分
1874-11-01 1874年11月1日-33日
1874-12-01 1874年12月14日
1875-01-01 1875年1月-0.71
1875-02-01 1875年2月-0.37
1875-03-01 1875年3月-0.59
1875-11-01 1875年11月-0.64
1875-12-01 1875年12月-0.75日
1876-01-01 1876年1月-0.95
1876-02-01 1876年2月1日-20日
1876-03-01 1876年3月1日至13日
1876-11-01 1876年11月0日15
1876-12-01 1876年12月23日
1877-01-01 1877年1月0日35
1877-02-01 1877年2月0日46
1877-03-01 1877年3月0.52日
1877-11-01 1877年11月2日08
1877-12-01 1877年12月2日49
1878-01-01 1878年1月2日41
1878-02-01 1878年2月2日43
1878-03-01 1878年3月1日31
1878-11-01 1878年11月-0.70
1878-12-01 1878年12月-0.75日
1879-01-01 1879年1月-0.55
1879-02-01 1879年2月-0.18日
1879-03-01 1879年3月-0.24日
1879-11-01 1879年11月1日至14日
1879-12-01 1879年12月1日
1880-01-01 1880年1月-1日
1880-02-01 1880年2月-0.73
1880-03-01 1880年3月-0.62
1880-11-01 1880年11月24日
1880-12-01 1880年12月18日
1881-01-01 1881年1月0日29
1881-02-01 1881年2月0日23
1881-03-01 1881年3月0日32
1881-11-01 1881年11月-0.59
1881-12-01 1881年12月-0.37日
1882-01-01 1882年1月-0.45
1882-02-01 1882年2月-0.55
1882-03-01 1882年3月-0.53
1882-11-01 1882年11月-0.92
1882-12-01 1882年12月-0.75日
- 在这个例子中,1870年和1882年的冬天是不完整的,分别由3个月和2个月组成。
- 这5个日期将被删除
- 计算每个季节的平均值
#在冬季数据帧的开始和结束时删除不完整的季节
冬季降落([pd.时间戳('1871-01-01'),
pd.时间戳('1871-02-01'),
pd.时间戳('1871-03-01'),
pd.时间戳('1882-11-01'),
pd.时间戳('1882-12-01')],就地=真)
#每5行计算一个季节的平均值
年平均值=winter.groupby(winter.reset_index().index//5)[value'].mean()
#为季节开始数据创建标签
冬季=局部放电日期范围(开始时间=1871-11-01',周期=11,频率=12毫秒)
#创建冬季平均数据帧
winter_avg=pd.DataFrame({'winter_start':winter_year,'season_avg':yearly_avg})
冬季平均设置指数(“冬季开始”,就地=真)
季节平均值
冬季开始
1871-11-01 -0.546
1872-11-01 -0.954
1873-11-01 -0.972
1874-11-01 -0.828
1875-11-01 -0.934
1876-11-01 0.342
1877-11-01 2.144
1878-11-01 -0.484
1879-11-01 -0.902
1880-11-01 0.252
1881-11-01 -0.498
绘制数据:
#防止未来的警告
从pandas.plotting导入寄存器\u matplotlib\u转换器
寄存器_matplotlib_转换器()
sns.lineplot(winter.index,winter['value'],label='all values')
sns.散点图(冬季平均指数,冬季平均['season\u avg'],标签='season avg',颜色='orange')
plt.ylabel('值')
plt.xlabel(年份)
plt.show()
您也可以通过以下方法实现
months=['一月'、'二月'、'三月'、'四月'、'五月'、'六月'、'七月'、'八月'、'九月'、'十月'、'十一月'、'十二月']
季节='11月至3月'。分割('-')
开始=月份。索引(季节[0])
结束=月份。指数(季节[1])
季节月份1=[]
季节月份2=[]
如果结束>=开始:
季节\月1=月[开始:结束+1]
df['result']=df[季节/月1]。平均值(轴=1)
如果结束<开始:
季节\月1=月[开始:12]
季节\月2=月[0:结束+1]
df2=df[季节/月份2+[年份]]
df2[“年”]=df2[“年”]+1
df3=df2.merge(df[季月1+['年']),how='lef
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1871 -0.25 -0.58 -0.43 -0.50 -0.70 -0.53 -0.60 -0.33 -0.24 -0.33 -0.31 -0.58
1872 -0.72 -0.62 -0.50 -0.77 -0.62 -0.52 -0.32 -0.85 -1.02 -0.94 -0.79 -0.88
1873 -0.78 -1.01 -1.31 -0.67 -0.53 -0.48 -0.58 -0.39 -0.34 -0.78 -0.77 -0.70
1874 -0.93 -1.06 -1.40 -0.94 -0.86 -0.72 -1.00 -1.05 -1.13 -1.25 -1.33 -1.14
1875 -0.71 -0.37 -0.59 -0.87 -1.09 -0.76 -0.85 -0.81 -0.91 -0.83 -0.64 -0.75
1876 -0.95 -1.20 -1.13 -1.18 -1.08 -0.43 -0.34 -0.16 -0.02 0.11 0.15 0.23
1877 0.35 0.46 0.52 0.50 0.76 0.98 1.42 1.54 1.75 1.95 2.08 2.49
1878 2.41 2.43 1.31 0.92 0.82 0.92 0.25 -0.11 -0.32 -0.53 -0.70 -0.75
1879 -0.55 -0.18 -0.24 -0.37 -0.83 -0.67 -0.77 -0.69 -0.83 -0.93 -1.14 -1.02
1880 -1.00 -0.73 -0.62 -0.57 -0.71 -0.61 -0.53 -0.24 -0.03 0.17 0.24 0.18
1881 0.29 0.23 0.32 0.41 0.16 0.23 -0.26 -0.17 -0.33 -0.43 -0.59 -0.37
1882 -0.45 -0.55 -0.53 0.10 0.01 -0.40 -0.57 -0.33 -0.51 -0.65 -0.92 -0.75
Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec result
0 1871 -0.25 -0.58 -0.43 -0.50 -0.70 -0.53 -0.60 -0.33 -0.24 -0.33 -0.31 -0.58 NaN
1 1872 -0.72 -0.62 -0.50 -0.77 -0.62 -0.52 -0.32 -0.85 -1.02 -0.94 -0.79 -0.88 311.511667
2 1873 -0.78 -1.01 -1.31 -0.67 -0.53 -0.48 -0.58 -0.39 -0.34 -0.78 -0.77 -0.70 311.615000
3 1874 -0.93 -1.06 -1.40 -0.94 -0.86 -0.72 -1.00 -1.05 -1.13 -1.25 -1.33 -1.14 311.405000
4 1875 -0.71 -0.37 -0.59 -0.87 -1.09 -0.76 -0.85 -0.81 -0.91 -0.83 -0.64 -0.75 311.703333
5 1876 -0.95 -1.20 -1.13 -1.18 -1.08 -0.43 -0.34 -0.16 -0.02 0.11 0.15 0.23 312.451667
6 1877 0.35 0.46 0.52 0.50 0.76 0.98 1.42 1.54 1.75 1.95 2.08 2.49 313.048333
7 1878 2.41 2.43 1.31 0.92 0.82 0.92 0.25 -0.11 -0.32 -0.53 -0.70 -0.75 312.980000
8 1879 -0.55 -0.18 -0.24 -0.37 -0.83 -0.67 -0.77 -0.69 -0.83 -0.93 -1.14 -1.02 313.831667
9 1880 -1.00 -0.73 -0.62 -0.57 -0.71 -0.61 -0.53 -0.24 -0.03 0.17 0.24 0.18 313.241667
10 1881 0.29 0.23 0.32 0.41 0.16 0.23 -0.26 -0.17 -0.33 -0.43 -0.59 -0.37 312.948333
11 1882 -0.45 -0.55 -0.53 0.10 0.01 -0.40 -0.57 -0.33 -0.51 -0.65 -0.92 -0.75 313.528333