61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
import xarray as xr
|
|
import pandas as pd
|
|
import numpy as np
|
|
from scipy.interpolate import interp1d
|
|
from scipy.signal import lombscargle
|
|
import os
|
|
import glob
|
|
from scipy.optimize import curve_fit
|
|
import math
|
|
from sklearn.decomposition import PCA
|
|
import sympy as sp
|
|
import matplotlib.pyplot as plt
|
|
import seaborn as sns
|
|
from matplotlib.patches import Patch
|
|
from matplotlib.lines import Line2D
|
|
from windrose import WindroseAxes
|
|
from scipy.signal import lombscargle, find_peaks
|
|
from itertools import permutations
|
|
from itertools import product
|
|
|
|
# 定义四舍五入函数
|
|
|
|
|
|
def round_to_nearest_multiple(value, multiple):
|
|
return round(value / multiple) * multiple
|
|
|
|
|
|
def read_data(path):
|
|
# 读取数据
|
|
with open(path, "rb") as f:
|
|
df = xr.open_dataset(f).to_dataframe().dropna(how="any")
|
|
|
|
# 提取指定列
|
|
columns_to_extract = ["alt", "press", "temp", "rh", "u", "v", "wspeed"]
|
|
extracted_df = df[columns_to_extract].copy()
|
|
|
|
# 进行单位转换
|
|
extracted_df["alt"] = extracted_df["alt"] / 1000 # km
|
|
extracted_df["rh"] = extracted_df["rh"] * 100 # %
|
|
|
|
# 移除重复的高度值
|
|
extracted_df = extracted_df.drop_duplicates(subset=["alt"])
|
|
new_height = np.arange(extracted_df["alt"].min(
|
|
), extracted_df["alt"].max() + 0.05, 0.05)
|
|
|
|
# 将每个高度值转换为最接近0.05的整数倍,并转化为数组
|
|
rounded_heights = [round_to_nearest_multiple(
|
|
height, 0.05) for height in new_height]
|
|
rounded_heights_np = np.array(rounded_heights)
|
|
|
|
# 初始化一个新的 DataFrame 用于存储插值结果
|
|
interpolated_data = pd.DataFrame({"alt": rounded_heights_np})
|
|
|
|
# 对每个因变量进行线性插值
|
|
for col in ["press", "temp", "rh", "u", "v", "wspeed"]:
|
|
interp_func = interp1d(
|
|
extracted_df["alt"], extracted_df[col], kind="linear", fill_value="extrapolate")
|
|
interpolated_data[col] = interp_func(rounded_heights_np)
|
|
|
|
return interpolated_data
|