如何用tidyr或dplyr对非表格化网格化降水数据做年度统计?
Absolutely, there are several straightforward, efficient ways to calculate the annual total precipitation for each grid cell from your CSV dataset. Let’s break down the most practical options depending on your preferred workflow and data size:
Since you mentioned the data is large and dynamically loaded, Pandas is perfect here—it lets you process the CSV in chunks to avoid blowing up your memory. Here’s a step-by-step script:
First, assume your CSV has columns that identify each grid (e.g., grid_lon, grid_lat) and a column with precipitation values (e.g., precipitation). If you need annual totals per grid (summing all observations for that grid) or per grid+year, adjust the grouping accordingly:
import pandas as pd # Adjust chunk size based on your available memory (100k rows is a safe starting point) chunk_size = 100000 grid_totals = pd.DataFrame() # Process the CSV in chunks for chunk in pd.read_csv('your_precip_data.csv', chunksize=chunk_size): # Group by grid identifiers and sum precipitation # Swap to ['grid_lon', 'grid_lat', 'year'] if you want annual totals per grid chunk_sum = chunk.groupby(['grid_lon', 'grid_lat'])['precipitation'].sum().reset_index() # Merge chunk results to build the full dataset if grid_totals.empty: grid_totals = chunk_sum else: grid_totals = pd.merge(grid_totals, chunk_sum, on=['grid_lon', 'grid_lat'], how='outer') grid_totals['precipitation'] = grid_totals['precipitation_x'].fillna(0) + grid_totals['precipitation_y'].fillna(0) grid_totals = grid_totals.drop(['precipitation_x', 'precipitation_y'], axis=1) # Save the final totals to a new CSV grid_totals.to_csv('grid_annual_total_precip.csv', index=False)
If you don’t want to mess with Python scripts, awk is a lightweight, super-fast tool built into most Unix-like systems (use WSL or Git Bash on Windows). It processes files line-by-line without loading everything into memory:
For grids identified by a single column (e.g., grid_id):
# Skip header row, sum precipitation by grid_id, output to a new CSV awk -F ',' 'NR>1 {sum[$1] += $2} END {for (id in sum) print id "," sum[id]}' your_precip_data.csv > grid_total_precip.csv
For grids identified by two columns (e.g., grid_lon + grid_lat):
awk -F ',' 'NR>1 {key=$1","$2; sum[key] += $3} END {for (k in sum) print k "," sum[k]}' your_precip_data.csv > grid_total_precip.csv
If your dataset isn’t astronomically large, or you prefer a point-and-click interface, Excel’s pivot tables make this simple:
- Open your CSV file in Excel.
- Select the entire data range, then go to Insert > PivotTable.
- Drag your grid identifier(s) (e.g.,
grid_lon,grid_lat) to the Rows area. - Drag your precipitation column to the Values area, then click the value field and set it to Sum.
- Add the
yearcolumn to Rows if you need annual totals per grid.
- Confirm grid uniqueness: Make sure each grid is consistently identified (no typos in coordinates/IDs) so your totals are accurate.
- Handle missing data: Use
fillna(0)in Pandas or adjust the awk script to skip empty values to avoid incorrect sums. - Double-check column positions: Ensure the column indices in the awk script match your CSV’s structure (e.g.,
$2is precipitation if it’s the second column).
内容的提问来源于stack exchange,提问作者jyson

