2.2高程变化获取
由于icesat-1 GLA14的数据是HDF文件格式,所以使用python来处理h5文件
2.2.1 提取HDF5文件信息
使用代码将h5文件中的数据信息分别提取并保存到CSV文件中,数据包括经纬度、时间、高程。
经纬度、高程问题:由于icesat-1卫星使用Topex/Poseidon椭球体与WGS84椭球体不同,所以进行改正使用WGS84坐标系。
时间问题:由于icesat-1 GLA14的数据中所给的时间为时间戳,所以要将其转换为UTC时间,在查询icesat-1 GLA14数据字典后知道该时间戳的起始时间为2000-00-00.将其写入,方便后续将时间戳转换为UTC时间。
使用python对CSV文件中的范围进行筛选,使用湖泊的shp矢量图进行筛选经纬度范围内的数据。
实现代码如下:
import h5py
import geopandas as gpd
import numpy as np
import os
import csv
# 定义Shapefile路径
shapefile_path = 'D:/ATL/NMCshapefile/111.shp'
# 加载Shapefile为Geopandas数据框
gdf = gpd.read_file(shapefile_path)
file_folder = 'F:/ICEsat GLA14/ALL H5/'
file_names = [f.name for f in os.scandir(file_folder) if f.name.endswith('.H5')]
# 定义起始时间
start_time = np.datetime64('2003-02-20T00:00:00')
for file_name in file_names:
file_path = os.path.join(file_folder, file_name)
# 打开 HDF5 文件
with h5py.File(file_path, 'r') as file:
# 从 HDF5 文件中读取数据
time = file['Data_40HZ']['Time']['d_UTCTime_40'][:]
elevation = file['Data_40HZ']['Elevation_Surfaces']['d_elev'][:]
latitude = file['Data_40HZ']['Geolocation']['d_lat'][:]
longitude = file['Data_40HZ']['Geolocation']['d_lon'][:]
# 将时间戳转换为实际日期和时间的字符串
timestamps = (start_time + np.timedelta64(1, 's') * time).astype(str)
# 将数据组合成数组
nc_data = np.column_stack((longitude, latitude, timestamps, elevation))
# 筛选位于Shapefile范围内的数据
points = gpd.points_from_xy(nc_data[:, 0], nc_data[:, 1])
mask = points.within(gdf.geometry.unary_union)
nc_data = nc_data[mask]
# 逐个比较并删除值为1.7976931348623157e+308的行
mask = np.logical_not(np.isclose(nc_data[:, 3].astype(float), 1.7976931348623157e+308))
nc_data = nc_data[mask]
# 删除包含无效值的行
mask = np.logical_not(np.char.isnumeric(nc_data[:, 3]))
nc_data = nc_data[mask]
# 定义列名
column_names = ['Longitude', 'Latitude', 'Time', 'Elevation']
# 将数据保存为CSV文件
output_file = file_path[:-3] + '.csv'
with open(output_file, 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
# 写入列名
writer.writerow(column_names)
# 写入数据
writer.writerows(nc_data)
2.2.2整合CSV
将所有的CSV文件整合到同一个CSV文件中方便处理。
代码实现如下:
import os
import shutil
def extract_files(source_folder, destination_folder, file_extension):
# 检查目标文件夹是否存在,如果不存在则创建它
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 遍历源文件夹及其子文件夹中的所有文件
for root, dirs, files in os.walk(source_folder):
for file in files:
# 检查文件扩展名是否匹配指定的类型
if file.endswith(file_extension):
# 构建源文件的完整路径
source_path = os.path.join(root, file)
# 构建目标文件的完整路径
destination_path = os.path.join(destination_folder, file)
# 将源文件复制到目标文件夹中
shutil.copy2(source_path, destination_path)
print("文件提取完成!")
# 指定源文件夹和目标文件夹的路径,以及要提取的文件类型(例如:'.txt')
source_folder = 'D:/ATL/Processed'
destination_folder = 'D:/ATL/CSV'
file_extension = '.csv'
# 调用函数进行文件提取
extract_files(source_folder, destination_folder, file_extension)
#说明:请确保将 source_folder、destination_folder 和 file_extension 的值替换为实际的文件夹路径和
#文件类型。此代码将遍历源文件夹及其所有子文件夹,并找到扩展名与指定的文件类型匹配的文件。然后,它将这些文件
#复制到目标文件夹中。最后,它将输出"文件提取完成!"作为提取过程的确认。
结果:
图 19
2.2.3时间只保留年月日
代码实现如下:
import pandas as pd
# 读取CSV文件
df = pd.read_csv('your_file.csv')
# 解析时间列
df['时间列'] = pd.to_datetime(df['时间列'])
# 格式化日期
df['时间列'] = df['时间列'].dt.strftime('%Y-%m-%d')
# 更新CSV文件
df.to_csv('your_file.csv', index=False)
结果:
图 20
图 21
2.2.4剔除数据中的异常值
由于短时间内的湖泊水位数据的变化不会出现明显波动,所以将同一时间的水位进行统计在一定的范围内,只提取在这一范围内的水位信息。
代码实现如下:
import pandas as pd
# 读取CSV文件
data = pd.read_csv('F:/ICEsat GLA14/修改后的文件.csv')
# 剔除水位超出范围的行
data_filtered = data[(data['Elevation'] >= 4668) & (data['Elevation'] <= 4698)]
# 生成新的CSV文件
data_filtered.to_csv('F:/ICEsat GLA14/修改后的文件_剔除异常行.csv', index=False)
结果:
图 22
2.2.5计算每年的水位平均值
由于湖泊的纪年法为水文年,青藏高原的湖泊水文年为上一年10月01日到本年的9月30日。先使用代码将时间转换为相应的水文年,在对其每年的水位求平均值。
代码实现如下:
import pandas as pd
# 读取CSV文件
data = pd.read_csv('F:/ICEsat GLA14/修改后的文件_剔除异常行.csv')
# 将时间列解析为日期格式
data['Time'] = pd.to_datetime(data['Time'])
# 筛选上一年10月1日至本年9月30日的数据
start_date = pd.Timestamp(data['Time'].dt.year.min(), 10, 1) # 上一年10月1日
end_date = pd.Timestamp(data['Time'].dt.year.max() + 1, 9, 30) # 本年9月30日
filtered_data = data[(data['Time'] >= start_date) & (data['Time'] <= end_date)]
# 计算水位平均值
average_elevation = filtered_data.groupby(filtered_data['Time'].dt.year)['Elevation'].mean()
# 导出到新的CSV文件
average_elevation.to_csv('F:/ICEsat GLA14/水位平均值_年度.csv', header=False, index=True)
结果:
图 23
年份 | 水位 |
2003 | 4691.196446 |
2004 | 4691.307561 |
2005 | 4691.231907 |
2006 | 4691.38027 |
2007 | 4691.733377 |
2008 | 4691.674959 |
2009 | 4692.091258 |
表格 2
2.2.6 Origin 绘图得
图 24水位变化