最近新到一批气象数据,数据格式为xlsx,每组数据时间间隔为1小时。
STATION_NAME | DATEVAL | PROVINCE | CITY | CNTY | STATION_ID_C | STATION_ID_D | LAT | LON | ALTI | YEAR | MON | DAY | HOUR | TEM | PRE_1H | PRE_24H | WIN_S_AVG_2MI | WIN_S_AVG_10MI | WIN_S_MAX |
顺义 | 2020-12-31 16:00:00+00:00 | 北京市 | 54398 | 54398 | 40.1333 | 116.6167 | 28.6 | 2021 | 1 | 1 | 0 | -8.1 | 0 | 0 | 1.2 | 1.3 | 1.5 | ||
海淀 | 2020-12-31 16:00:00+00:00 | 北京市 | 市辖区 | 海淀区 | 54399 | 54399 | 39.9833 | 116.2833 | 45.8 | 2021 | 2 | 1 | 12 | -9.8 | 0 | 0 | 0.3 | 0.3 | 0.9 |
延庆 | 2020-12-31 16:00:00+00:00 | 北京市 | 县 | 延庆县 | 54406 | 54406 | 40.45 | 115.9667 | 487.9 | 2021 | 3 | 1 | 15 | -7.1 | 0 | 0 | 2.8 | 2.8 | 3.4 |
密云 | 2020-12-31 16:00:00+00:00 | 北京市 | 54416 | 54416 | 40.3833 | 116.8667 | 71.8 | 2021 | 9 | 1 | 23 | -12.9 | 0 | 0 | 1.6 | 1.1 | 1.5 |
需要对每小时的数据进行一次插值,因此要将数据按小时提取出来,2022010100,即为1月1日0时的所有站点数据。
对相关工具进行了解后,发现query完美满足需求。
另外由于需要批量处理,query中使用了变量名,这时候需要在query前加上@。
import pandas as pd
import xlwt
wb= pd.read_excel(r"F:\test.xlsx") # pandas方法读取xlsx
print("列名{}".format(wb.columns.values))
for m in ['1', '3', '5', '7', '8', '10', '12']:
for i in range(1, 32, 1): # 逐日循环
for j in range(24):
month = int(m)
info = int(i)
joy = int(j)
var = wb.query("(MON == @month)& (DAY == @info)& (HOUR == @joy)")
#[wb.DAY == m & wb.DAY.isin(i) & wb.HOUR.isin(j)] # 按小时筛选行数据
filepath = r'F:\testresult\2022'+ '.'+str(m)+'.'+str(i)+ '.'+str(j)+'.xls'
print(filepath)
var.to_excel(filepath)
for mo in ['2', '4', '6', '9', '11']:
for io in range(1, 31, 1): # 逐日循环
for jo in range(24):
montho = int(mo)
infoo = int(io)
joyo = int(jo)
var0 = wb.query("(MON == @motho)& (DAY == @infoo)& (HOUR == @joyo)")
#[wb.DAY == m & wb.DAY.isin(i) & wb.HOUR.isin(j)] # 按小时筛选行数据
filepath = r'F:\testresult\2022'+ '.'+str(mo)+'.'+str(io)+ '.'+str(jo)+'.xls'
print(filepath)
var0.to_excel(filepath)
最后需要对2月的数据进行处理,删除掉多的29号、30号结果。