import netCDF4 as nc import pandas as pd import numpy as np #文件读取 diri = 'D:/Science/graduation/data/result/' file = '成都平原背景.xlsx' sfile = 'cdpypre.xlsx' #输出文件 outfile = pd.ExcelWriter('D:/Science/graduation/data/result/sx成都平原背景.xlsx') #读取数据 data = pd.read_excel(diri+file,sheet_name='O3污染季节',header = 0) date = pd.read_excel(diri+sfile) #筛选掉降水量大于2mm的天数 data = data.loc[data.isin(date)].dropna() print(data)
时间: 2023-06-15 12:08:24 浏览: 135
这段代码是用来读取 netCDF4 格式文件中的数据,并进行简单的数据处理。具体来说,它使用了 pandas 库读取了两个 Excel 文件,一个是成都平原背景.xlsx,另一个是cdpypre.xlsx。然后使用 pd.ExcelWriter() 创建了一个名字为 sx成都平原背景.xlsx 的 Excel 输出文件。接着,利用 pd.read_excel() 读取了成都平原背景.xlsx 文件中 "O3污染季节" 工作表的数据,再次使用 pd.read_excel() 读取了 cdpypre.xlsx 文件中的数据。最后,它对 data 中的数据进行了筛选,把日期在 date 中的数据留下,去掉了降水量大于2mm的天数。输出了筛选后的 data 数据。
相关问题
import pandas as pd import xarray as xr from tqdm import tqdm from dask.diagnostics import ProgressBar import numpy as np # 读取NetCDF文件 file_path = 'D:/thesis of 2025/Data/Database/original/2020-2024windspeed.nc' output_path = 'D:/thesis of 2025/Data/Database/modification/windspeed_2020-2024.csv' ds = xr.open_dataset(file_path,chunks={'valid_time': 1624}) # 分块读取数据 # 提取100米风速的u和v分量 u100 = ds['u100'] # 提取100米风速的u分量 v100 = ds['v100'] # 提取100米风速的v分量 # 初始化进度条 with ProgressBar(): # 将u100风速数据转换为二维数组 u100_2d_0 = u100.stack(latlon=('latitude', 'longitude')).to_pandas() # 重置索引,将时间作为一维,合并后的经度和纬度作为另一维 u100_2d = u100_2d_0.reset_index() with ProgressBar(): # 将v100风速数据转换为二维数组 v100_2d_0 = v100.stack(latlon=('latitude', 'longitude')).to_pandas() # 重置索引,将时间作为一维,合并后的经度和纬度作为另一维 v100_2d = v100_2d_0.reset_index() # 计算实际风速(根据勾股定理) with ProgressBar(): windspeed_2d = pd.concat([u100_2d, v100_2d], axis=1) windspeed_2d['windspeed'] = np.sqrt(windspeed_2d['u100']**2 + windspeed_2d['v100']**2) # 保存到CSV文件 with ProgressBar(): windspeed_2d.to_csv(output_path, index=True) # 储存文件 # 使用pandas读取CSV文件的前5行 df = pd.read_csv(output_path, nrows=5) print(df) 在后两个过程(计算实际风速、保存文件)中,会显示进度条吗?如不会,该如何显示进度条
<think>嗯,用户想知道在使用Dask和Pandas处理数据时如何正确显示进度条,特别是在计算实际风速和保存文件的时候。首先,我需要回忆一下Dask和Pandas在处理进度条方面的不同机制。
用户提到了Dask的ProgressBar,我记得Dask确实有一个诊断模块,里面有ProgressBar,可以用来跟踪任务的进度。而Pandas本身可能没有内置的进度条功能,但可能有第三方库,比如tqdm,可以配合使用。不过用户的问题中特别提到了Dask和Pandas,所以可能需要分别处理这两个库的进度条显示。
首先,Dask方面,当使用dask.dataframe进行计算时,比如读取大文件、应用函数或者进行聚合操作,可以通过启用ProgressBar来显示进度。需要从dask.diagnostics导入ProgressBar,然后在计算时使用with语句包裹,这样就能在任务执行时显示进度条了。例如,在计算风速时,如果用的是Dask的并行处理,应该在.compute()方法调用时激活ProgressBar。
然后是保存文件的过程。Dask的to_csv方法是延迟执行的,所以当调用.compute()时,进度条才会显示保存的进度。这里需要注意,保存CSV可能需要将数据写入多个分区文件,或者合并成一个,这时候进度条应该能够反映出来。但用户提到的是保存到较小的Pandas友好的CSV文件,可能意味着最后的结果是Pandas DataFrame,所以保存的时候可能用的是Pandas的to_csv,这时候可能需要用tqdm来显示进度条,但Pandas的保存操作通常是同步的,可能无法直接显示进度。这时候可能需要分块处理,手动更新进度条。
另外,用户可能将Dask处理后的结果转换为Pandas DataFrame,然后在保存时使用Pandas的方法。这时候需要考虑如何在这两个阶段都显示进度条。例如,当Dask计算完成后,得到一个结果,再用Pandas保存,这时候可能需要用tqdm包装写入过程,但Pandas的to_csv本身不支持进度条,所以可能需要手动分块写入,并在每个块处理后更新进度条。
需要检查用户提供的引用,特别是引用[1]和[4],里面提到使用Dask的ProgressBar来显示任务进度条,以及Dask在读取数据时不会立即加载到内存,而是准备进行计算。引用[3]提到将结果保存到较小的CSV文件,然后继续用Pandas分析。因此,用户可能在Dask处理阶段结束后,将结果转换为Pandas DataFrame,再保存为CSV。
所以可能的步骤是:
1. 在Dask处理阶段(比如计算风速),使用Dask的ProgressBar来显示计算进度。
2. 在保存为CSV时,如果是用Dask的to_csv方法,同样使用ProgressBar;如果转换为Pandas DataFrame后保存,可能需要使用tqdm来手动显示进度,或者分块写入。
另外,需要确保在保存时调用了.compute()来触发Dask的任务执行,否则不会显示进度条。例如,当使用Dask的to_csv时,虽然操作是延迟的,但必须通过计算来执行,这时候ProgressBar才会生效。
可能的问题点:用户是否在保存时正确调用了计算,以及是否正确使用了ProgressBar的上下文管理器。例如,在保存CSV时,如果使用的是Dask的to_csv,需要确保在with ProgressBar():块内执行compute,否则进度条不会显示。
另外,用户可能混淆了Dask和Pandas的进度条处理。需要明确区分两者的使用场景。例如,Dask的ProgressBar用于并行任务,而Pandas可能需要tqdm的自定义实现。
总结解决方案:
- 对于Dask操作,使用dask.diagnostics.ProgressBar来包裹计算过程。
- 对于Pandas操作,使用tqdm库来创建自定义进度条,特别是在保存大文件时可能分块处理。
- 在保存CSV时,如果是用Dask导出,确保在compute时启用ProgressBar;如果是用Pandas,可能需要手动处理分块和进度更新。
最后,需要给出代码示例,展示如何在这两种情况下正确显示进度条,并引用相关的参考文献,如引用[1]和[3]提到的Dask进度条和保存CSV的过程。</think>### 分步解答:如何在Dask与Pandas中正确显示进度条
#### 一、Dask计算阶段显示进度条
Dask的`ProgressBar`通过监控任务执行状态实现进度可视化,需在计算触发时(如`.compute()`)激活。
1. **导入ProgressBar并包裹计算过程**
```python
from dask.diagnostics import ProgressBar
# 假设dd为dask.dataframe
with ProgressBar():
result = dd.compute() # 触发计算并显示进度条
```
2. **应用于风速计算示例**
```python
def calculate_wind_speed(dask_df):
dask_df['wind_speed'] = (dask_df['u']**2 + dask_df['v']**2)**0.5
return dask_df
with ProgressBar():
df_with_speed = calculate_wind_speed(dask_df).compute() # 计算并显示进度[^1]
```
#### 二、保存文件时显示进度
需区分保存操作使用Dask还是Pandas:
1. **使用Dask保存CSV**
```python
with ProgressBar():
dask_df.to_csv('output_*.csv', index=False).compute() # 分块保存时显示进度[^3]
```
2. **使用Pandas保存时的替代方案**
若结果已转为Pandas DataFrame,可手动分块保存并配合`tqdm`:
```python
from tqdm import tqdm
chunk_size = 10000
with tqdm(total=len(df)//chunk_size) as pbar:
for i in range(0, len(df), chunk_size):
df.iloc[i:i+chunk_size].to_csv('output.csv', mode='a', header=(i==0))
pbar.update(1)
```
#### 三、完整工作流示例
```python
from dask import dataframe as dd
from dask.diagnostics import ProgressBar
import pandas as pd
# Dask读取数据
dask_df = dd.read_csv('wind_data_*.csv', dtype={'u': float, 'v': float})
# 计算风速(显示进度)
with ProgressBar():
dask_df['wind_speed'] = (dask_df.u**2 + dask_df.v**2)**0.5
computed_df = dask_df.compute()
# 转为Pandas后分块保存(显示进度)
from tqdm import tqdm
chunk_size = 50000
with tqdm(total=len(computed_df)//chunk_size + 1) as pbar:
for i in range(0, len(computed_df), chunk_size):
computed_df.iloc[i:i+chunk_size].to_csv('final_output.csv',
mode='a',
header=(i==0))
pbar.update(1)
```
import netCDF4 as nc import numpy as np from netCDF4 import Dataset import matplotlib.pyplot as plt from matplotlib.cm import get_cmap from matplotlib.colors import from_levels_and_colors import cartopy.crs as crs import cartopy.feature as cfeature from cartopy.feature import NaturalEarthFeature import cartopy.crs as ccrs import cartopy.feature as cfeature from wrf import (to_np, getvar, smooth2d, get_cartopy, cartopy_xlim, cartopy_ylim, latlon_coords) import warnings warnings.filterwarnings('ignore') file = 'D:/transfer/wrfout_d01_2016-03-01_00_00_00' ncfile = Dataset("D:/transfer/wrfout_d01_2016-03-01_00_00_00") dataset = nc.Dataset(file) latitude = dataset.variables['XLAT'][0][:] longitude = dataset.variables['XLONG'][0][:] co = dataset.variables['co'][1][1][:][:] co1 = getvar(ncfile, "co") cart_proj = get_cartopy(co1) plt.contourf(longitude,latitude, co, levels=38, cmap='hot',projection=cart_proj) plt.colorbar() # 创建一个投影 ax = plt.axes(projection=cart_proj) # 添加底图特征 ax.add_feature(cfeature.COASTLINE) ax.add_feature(cfeature.BORDERS) # 设置地图范围 ax.set_extent([90, 110, 0, 30],) plt.show()
以下是一个可能的代码优化方案:
1. 删除未使用的库和模块
在代码中,导入了一些未使用的库和模块,包括numpy、get_cmap、from_levels_and_colors等,可以将其删除以减少代码量。
2. 删除重复导入的库和模块
在代码中,导入了多个相同的库和模块,包括cartopy、cartopy.crs、cartopy.feature,可以将其合并为一个导入语句。
3. 优化变量的命名和赋值
在代码中,一些变量的命名不够直观,例如co、co1等,可以改为更具有描述性的名称。另外,一些变量的赋值方式可以简化为一行。
4. 简化图形绘制代码
在代码中,图形绘制的代码比较冗长,可以简化为一行或者几行,同时可以将一些公共的参数提取出来作为全局变量,以便后续的绘图。
综上所述,以下是一个可能的优化后的代码:
```
import netCDF4 as nc
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from netCDF4 import Dataset
from wrf import to_np, getvar, get_cartopy
warnings.filterwarnings('ignore')
file = 'D:/transfer/wrfout_d01_2016-03-01_00_00_00'
ncfile = Dataset(file)
latitude = ncfile.variables['XLAT'][0][:]
longitude = ncfile.variables['XLONG'][0][:]
co = ncfile.variables['co'][1][1][:][:]
cart_proj = get_cartopy(getvar(ncfile, "co"))
plt.contourf(longitude, latitude, co, levels=38, cmap='hot', projection=cart_proj)
plt.colorbar()
ax = plt.axes(projection=cart_proj)
ax.set_extent([90, 110, 0, 30])
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS)
plt.show()
```
阅读全文
相关推荐















