Icesat-1 GLA14数据python处理保姆式教学(附代码)

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水位变化

 

 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值