2025-02-21 14:24:05 +08:00

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