python-CIMIS


Namepython-CIMIS JSON
Version 1.3.5 PyPI version JSON
download
home_pagehttps://github.com/Precision-Irrigation-Management-lab/Python-CIMIS
SummaryA comprehensive Python client for the California Irrigation Management Information System (CIMIS) API
upload_time2025-07-20 17:31:26
maintainerPrecision Irrigation Management Lab (PRIMA)
docs_urlNone
authorMahipal Reddy Ramireddy, M. A. Andrade
requires_python>=3.8
licenseNone
keywords cimis weather california irrigation agriculture climate data api meteorology evapotranspiration
VCS
bugtrack_url
requirements requests
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Python CIMIS Client

A comprehensive Python client library for the California Irrigation Management Information System (CIMIS) API. This library provides easy access to CIMIS weather station data, spatial data, and station information with built-in CSV export functionality.

[![PyPI version](https://badge.fury.io/py/python-CIMIS.svg)](https://badge.fury.io/py/python-CIMIS)
[![Python versions](https://img.shields.io/pypi/pyversions/python-CIMIS.svg)](https://pypi.org/project/python-CIMIS/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Documentation Status](https://readthedocs.org/projects/python-cimis/badge/?version=latest)](https://python-cimis.readthedocs.io/en/latest/?badge=latest)

## ๐Ÿ“š Documentation

**๐Ÿ“– [Complete Documentation](https://python-cimis.readthedocs.io/)** - Detailed guides, API reference, and examples

## ๐Ÿ“‹ Table of Contents

- [๐Ÿš€ Quick Start](#-quick-start)
- [โœจ Features](#-features)
- [๐Ÿ“ฆ Installation](#-installation)
- [๐Ÿ”‘ API Key Setup](#-api-key-setup)
- [๐Ÿ“– Usage Examples](#-usage-examples)
  - [Daily Weather Data](#daily-weather-data)
  - [Hourly Weather Data](#hourly-weather-data)
  - [Station Information](#station-information)
  - [CSV Export](#csv-export)
  - [Error Handling](#error-handling)
- [๐Ÿ“Š Available Data Items](#-available-data-items)
- [๐Ÿ› ๏ธ Advanced Usage](#๏ธ-advanced-usage)
- [๐Ÿ”ง Configuration](#-configuration)
- [๐Ÿ“š API Reference](#-api-reference)
- [๐Ÿค Contributing](#-contributing)

## ๐Ÿš€ Quick Start

```python
from python_cimis import CimisClient
from datetime import date

# Initialize the client with your API key
client = CimisClient(app_key="your-api-key-here")

# Get daily weather data for specific stations
weather_data = client.get_daily_data(
    targets=[2, 8, 127],  # Station numbers
    start_date="2023-01-01",
    end_date="2023-01-05"
)

# Export to CSV with all available columns
client.export_to_csv(weather_data, "weather_data.csv")

# Or get data and export in one step
weather_data = client.get_data_and_export_csv(
    targets=[2, 8, 127],
    start_date=date(2023, 1, 1),
    end_date=date(2023, 1, 5),
    filename="comprehensive_weather_data.csv"
)
```

## โœจ Features

- **๐ŸŒ Comprehensive API Coverage**: Access all CIMIS API endpoints including weather data, station information, and zip code data
- **๐Ÿ“ก Multiple Data Sources**: Support for both Weather Station Network (WSN) and Spatial CIMIS System (SCS) data
- **๐ŸŽฏ Flexible Data Retrieval**: Get data by station numbers, zip codes, coordinates, or street addresses
- **๐Ÿ“Š Built-in CSV Export**: Export all data with comprehensive column coverage by default
- **๐Ÿ Easy to Use**: Simple, Pythonic interface with sensible defaults
- **โš ๏ธ Error Handling**: Comprehensive exception handling with descriptive error messages
- **๐Ÿ“ Type Hints**: Full type hint support for better IDE integration
- **โšก Performance**: Efficient data processing and export functionality

## ๐Ÿ“ฆ Installation

### From PyPI (Recommended)

```bash
pip install python-CIMIS
```

### From Source

```bash
git clone https://github.com/python-cimis/python-cimis-client.git
cd python-cimis-client
pip install -e .
```

## ๐Ÿ”‘ API Key Setup

You need a CIMIS API key to use this library. 

### Get Your API Key

1. Visit the [CIMIS website](https://cimis.water.ca.gov/Default.aspx)
2. Register for a free account
3. Generate your API key from your account dashboard

### Set Up Your API Key

```python
# Option 1: Pass directly to client (not recommended for production)
client = CimisClient(app_key="your-api-key-here")

# Option 2: Use environment variable (recommended)
import os
os.environ['CIMIS_API_KEY'] = 'your-api-key-here'
client = CimisClient(app_key=os.getenv('CIMIS_API_KEY'))

# Option 3: Load from config file
import json
with open('config.json') as f:
    config = json.load(f)
client = CimisClient(app_key=config['cimis_api_key'])
```

## ๐Ÿ“– Usage Examples

### Daily Weather Data

#### ๐Ÿญ By Station Numbers

```python
from python_cimis import CimisClient
from datetime import date, timedelta

client = CimisClient(app_key="your-api-key-here")

# Get data for specific weather stations
weather_data = client.get_daily_data(
    targets=[2, 8, 127],  # Station numbers: Davis, UC Davis, Five Points
    start_date="2023-01-01",
    end_date="2023-01-31"
    # unit_of_measure defaults to "Metric"
)

print(f"Retrieved {len(weather_data.get_all_records())} records")
```

#### ๐Ÿ“ฎ By Zip Codes

```python
# Get data for specific zip codes
weather_data = client.get_daily_data(
    targets=["95823", "94503", "93624"],
    start_date="2023-01-01",
    end_date="2023-01-31",
    prioritize_scs=True  # Prioritize Spatial CIMIS System data
)

# Export to CSV
client.export_to_csv(weather_data, "zip_code_weather.csv")
```

#### ๐Ÿ—บ๏ธ By Coordinates

```python
# Get data for specific coordinates (latitude, longitude)
weather_data = client.get_data(
    targets=[
        "lat=39.36,lng=-121.74",  # Near Yuba City
        "lat=38.22,lng=-122.82"   # Near Santa Rosa
    ],
    start_date="2023-01-01",
    end_date="2023-01-31",
    data_items=["day-asce-eto", "day-sol-rad-avg"]  # Only ETo and solar radiation
)
```

#### ๐Ÿ  By Addresses

```python
# Get data for specific addresses
weather_data = client.get_data(
    targets=[
        "addr-name=State Capitol,addr=1315 10th Street Sacramento, CA 95814",
        "addr-name=SF City Hall,addr=1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102"
    ],
    start_date="2023-01-01",
    end_date="2023-01-31",
    data_items=["day-asce-eto", "day-sol-rad-avg"]
)
```

### Hourly Weather Data

```python
# Get hourly data (only available from WSN stations)
# Note: Hourly data requests should be for shorter periods due to data volume
from datetime import datetime, timedelta

yesterday = datetime.now() - timedelta(days=1)
start_date = yesterday.strftime('%Y-%m-%d')
end_date = start_date  # Same day for hourly data

hourly_data = client.get_hourly_data(
    targets=[2, 8, 127],
    start_date=start_date,
    end_date=end_date
)

# Export hourly data (automatically uses clean column names)
client.export_to_csv(hourly_data, "hourly_weather.csv")
```

### Station Information

```python
# Get all available stations
all_stations = client.get_stations()
print(f"Total stations: {len(all_stations)}")

# Get specific station information
station = client.get_stations(station_number="2")
print(f"Station: {station[0].name} in {station[0].city}")

# Export station information to CSV
client.export_stations_to_csv(all_stations, "all_stations.csv")

# Get zip code information
station_zips = client.get_station_zip_codes()
spatial_zips = client.get_spatial_zip_codes()
```

### CSV Export

```python
# Basic export with all columns (default)
client.export_to_csv(weather_data, "complete_data.csv")

# Export with automatic filename generation
filename = client.export_to_csv(weather_data)
print(f"Data exported to: {filename}")

# Export daily and hourly data separately (recommended)
mixed_data = client.get_data(
    targets=[2, 8],
    start_date="2023-01-01",
    end_date="2023-01-02"
)
result = client.export_to_csv(mixed_data, "weather_data.csv")
# Creates: weather_data_daily.csv and weather_data_hourly.csv

# One-step data retrieval and export
client.get_data_and_export_csv(
    targets=[2, 8, 127],
    start_date="2023-01-01",
    end_date="2023-01-05",
    filename="january_weather.csv"
)
```

### Error Handling

```python
from python_cimis import (
    CimisClient, 
    CimisAPIError, 
    CimisAuthenticationError,
    CimisDataError,
    CimisConnectionError
)

client = CimisClient("your-api-key")

try:
    weather_data = client.get_daily_data(
        targets=[999999],  # Invalid station
        start_date="2023-01-01",
        end_date="2023-01-01"
    )
except CimisAuthenticationError:
    print("โŒ Invalid API key or authentication failed")
except CimisConnectionError:
    print("โŒ Network connection error")
except CimisDataError as e:
    print(f"โŒ Data error: {e}")
except CimisAPIError as e:
    print(f"โŒ API Error: {e}")
except Exception as e:
    print(f"โŒ Unexpected error: {e}")
```

### Custom Data Items

```python
# Specify custom data items for specific needs
temperature_only = [
    "day-air-tmp-avg", 
    "day-air-tmp-max", 
    "day-air-tmp-min"
]

eto_and_weather = [
    "day-asce-eto",
    "day-precip", 
    "day-sol-rad-avg",
    "day-wind-spd-avg",
    "day-rel-hum-avg"
]

# Get only temperature data
temp_data = client.get_daily_data(
    targets=[2, 8, 127],
    start_date="2023-01-01",
    end_date="2023-01-31",
    data_items=temperature_only
)

# Get ETo calculation inputs
eto_data = client.get_daily_data(
    targets=[2, 8, 127],
    start_date="2023-01-01",
    end_date="2023-01-31",
    data_items=eto_and_weather
)
```

## ๐Ÿ“Š Available Data Items

### ๐ŸŒ… Daily Data Items (WSN + SCS)

| Category | Data Items | Description |
|----------|------------|-------------|
| **๐ŸŒก๏ธ Temperature** | `day-air-tmp-avg`, `day-air-tmp-max`, `day-air-tmp-min` | Average, maximum, and minimum air temperature |
| **๐Ÿ’ง Humidity** | `day-rel-hum-avg`, `day-rel-hum-max`, `day-rel-hum-min` | Relative humidity measurements |
| **๐ŸŒฟ Evapotranspiration** | `day-eto`, `day-asce-eto`, `day-asce-etr` | Reference evapotranspiration calculations |
| **โ˜€๏ธ Solar Radiation** | `day-sol-rad-avg`, `day-sol-rad-net` | Solar radiation measurements |
| **๐Ÿ’จ Wind** | `day-wind-spd-avg`, `day-wind-run` | Wind speed and directional components |
| **๐ŸŒ Soil** | `day-soil-tmp-avg`, `day-soil-tmp-max`, `day-soil-tmp-min` | Soil temperature at various depths |
| **๐ŸŒง๏ธ Other** | `day-precip`, `day-dew-pnt`, `day-vap-pres-avg` | Precipitation, dew point, vapor pressure |

### โฐ Hourly Data Items (WSN only)

| Category | Data Items | Description |
|----------|------------|-------------|
| **๐ŸŒก๏ธ Temperature** | `hly-air-tmp`, `hly-soil-tmp` | Hourly air and soil temperature |
| **๐Ÿ’ง Humidity** | `hly-rel-hum` | Hourly relative humidity |
| **๐ŸŒฟ Evapotranspiration** | `hly-eto`, `hly-asce-eto`, `hly-asce-etr` | Hourly ET calculations |
| **โ˜€๏ธ Solar** | `hly-sol-rad`, `hly-net-rad` | Hourly solar radiation |
| **๐Ÿ’จ Wind** | `hly-wind-spd`, `hly-wind-dir`, `hly-res-wind` | Hourly wind measurements |
| **๐ŸŒง๏ธ Other** | `hly-precip`, `hly-dew-pnt`, `hly-vap-pres` | Hourly precipitation and atmospheric data |

> **๐Ÿ“ Note**: When exporting hourly data to CSV, column names automatically have the "Hly" prefix removed for cleaner formatting (e.g., `HlyAirTmp` becomes `AirTmp_Value`).

## ๐Ÿ› ๏ธ Advanced Usage

### Batch Processing Multiple Locations

```python
from concurrent.futures import ThreadPoolExecutor
import pandas as pd

def get_station_data(station_id):
    """Get data for a single station"""
    try:
        data = client.get_daily_data(
            targets=[station_id],
            start_date="2023-01-01",
            end_date="2023-01-31"
        )
        return station_id, data
    except Exception as e:
        print(f"Error for station {station_id}: {e}")
        return station_id, None

# Process multiple stations in parallel
stations = [2, 8, 127, 54, 6]
results = {}

with ThreadPoolExecutor(max_workers=3) as executor:
    futures = [executor.submit(get_station_data, station) for station in stations]
    for future in futures:
        station_id, data = future.result()
        if data:
            results[station_id] = data
```

### Data Analysis Integration

```python
import pandas as pd
import matplotlib.pyplot as plt

# Get weather data
weather_data = client.get_daily_data(
    targets=[2],  # Davis station
    start_date="2023-01-01",
    end_date="2023-12-31",
    data_items=["day-air-tmp-avg", "day-asce-eto", "day-precip"]
)

# Export to CSV
csv_file = client.export_to_csv(weather_data, "davis_2023.csv")

# Load into pandas for analysis
df = pd.read_csv(csv_file)
df['Date'] = pd.to_datetime(df['Date'])

# Basic analysis
print(f"Average temperature: {df['DayAirTmpAvg_Value'].mean():.1f}ยฐC")
print(f"Total precipitation: {df['DayPrecip_Value'].sum():.1f}mm")
print(f"Total ETo: {df['DayAsceEto_Value'].sum():.1f}mm")

# Simple visualization
plt.figure(figsize=(12, 6))
plt.plot(df['Date'], df['DayAirTmpAvg_Value'])
plt.title('Daily Average Temperature - Davis Station 2023')
plt.ylabel('Temperature (ยฐC)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
```

### Custom Data Validation

```python
def validate_weather_data(weather_data):
    """Validate weather data quality"""
    records = weather_data.get_all_records()
    
    issues = []
    for record in records:
        # Check for missing critical data
        if 'DayAsceEto' in record.data_values:
            eto_value = record.data_values['DayAsceEto'].value
            qc_flag = record.data_values['DayAsceEto'].qc
            
            if not eto_value or eto_value == '':
                issues.append(f"Missing ETo data for {record.date}")
            elif qc_flag and qc_flag.strip() not in [' ', '']:
                issues.append(f"Quality issue for ETo on {record.date}: {qc_flag}")
    
    return issues

# Use validation
weather_data = client.get_daily_data(targets=[2], start_date="2023-01-01", end_date="2023-01-31")
issues = validate_weather_data(weather_data)
if issues:
    print("Data quality issues found:")
    for issue in issues[:5]:  # Show first 5 issues
        print(f"  - {issue}")
```

## ๐Ÿ”ง Configuration

### Environment Variables

```bash
# Set your API key as an environment variable (recommended)
export CIMIS_API_KEY="your-api-key-here"

# Optional: Set default timeout
export CIMIS_TIMEOUT="30"
```

### Client Configuration

```python
# Configure client with custom settings
client = CimisClient(
    app_key="your-api-key",
    timeout=60,  # Custom timeout in seconds
    base_url="https://et.water.ca.gov/api"  # Custom base URL if needed
)

# Check client configuration
print(f"API Key configured: {'Yes' if client.app_key else 'No'}")
print(f"Timeout: {client.timeout} seconds")
```

## ๐Ÿ“š API Reference

### CimisClient Class

```python
from python_cimis import CimisClient

client = CimisClient(
    app_key: str,           # Your CIMIS API key (required)
    timeout: int = 30,      # Request timeout in seconds
    base_url: str = None    # Custom API base URL (optional)
)
```

### Main Methods

| Method | Description | Returns |
|--------|-------------|---------|
| `get_daily_data()` | Get daily weather data | `WeatherData` object |
| `get_hourly_data()` | Get hourly weather data | `WeatherData` object |
| `get_data()` | Get weather data (flexible) | `WeatherData` object |
| `get_stations()` | Get station information | `List[Station]` |
| `get_station_zip_codes()` | Get WSN zip codes | `List[ZipCode]` |
| `get_spatial_zip_codes()` | Get SCS zip codes | `List[SpatialZipCode]` |
| `export_to_csv()` | Export data to CSV | `str` (filename) |
| `export_stations_to_csv()` | Export stations to CSV | `str` (filename) |
| `get_data_and_export_csv()` | Get data and export in one step | `Tuple[WeatherData, str]` |

### Method Parameters

#### get_daily_data() / get_hourly_data()

```python
client.get_daily_data(
    targets: Union[str, List[str]],           # Station numbers, zip codes, coordinates
    start_date: Union[str, date, datetime],   # Start date (YYYY-MM-DD)
    end_date: Union[str, date, datetime],     # End date (YYYY-MM-DD)
    data_items: Optional[List[str]] = None,   # Specific data items (optional)
    unit_of_measure: str = 'Metric',          # 'Metric' or 'English'
    csv: bool = False,                        # Export to CSV immediately
    filename: Optional[str] = None            # CSV filename (if csv=True)
)
```

## ๐Ÿงฉ Data Models

### WeatherData
Container for weather data responses with methods:
- `get_all_records()`: Get all weather records
- `get_daily_records()`: Get only daily records  
- `get_hourly_records()`: Get only hourly records

### WeatherRecord
Individual weather data record with attributes:
- `date`: Record date (YYYY-MM-DD)
- `station`: Station identifier
- `data_values`: Dictionary of data measurements
- `scope`: 'daily' or 'hourly'

### Station
Weather station information with attributes:
- `station_nbr`: Station number
- `name`: Station name
- `city`: City location
- `latitude`, `longitude`: Coordinates
- `elevation`: Station elevation

## ๐Ÿ’ก Best Practices

### 1. API Key Security
```python
# โœ… Good: Use environment variables
import os
client = CimisClient(app_key=os.getenv('CIMIS_API_KEY'))

# โŒ Avoid: Hardcoding API keys
client = CimisClient(app_key="your-key-here")  # Don't do this!
```

### 2. Date Range Management
```python
# โœ… Good: Reasonable date ranges
from datetime import date, timedelta

# For daily data: up to 1 year
start_date = date.today() - timedelta(days=365)
end_date = date.today() - timedelta(days=1)

# For hourly data: keep it short (1-7 days)
start_date = date.today() - timedelta(days=1)
end_date = date.today() - timedelta(days=1)
```

### 3. Error Handling
```python
# โœ… Good: Comprehensive error handling
from python_cimis import CimisClient, CimisAPIError

try:
    weather_data = client.get_daily_data(targets=[2], start_date="2023-01-01", end_date="2023-01-31")
except CimisAPIError as e:
    print(f"API Error: {e}")
    # Handle error appropriately
```

### 4. Performance Optimization
```python
# โœ… Good: Request specific data items when possible
data_items = ["day-asce-eto", "day-precip", "day-air-tmp-avg"]
weather_data = client.get_daily_data(
    targets=[2, 8, 127],
    start_date="2023-01-01",
    end_date="2023-01-31",
    data_items=data_items  # Reduces response size
)
```

## Requirements

- **Python**: 3.8+
- **Dependencies**: 
  - requests >= 2.25.0

## ๐Ÿค Contributing

Contributions are welcome! Here's how you can help:

### Development Setup
```bash
# Clone the repository
git clone https://github.com/python-cimis/python-cimis-client.git
cd python-cimis-client

# Create virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run linting
black python_cimis/
flake8 python_cimis/
mypy python_cimis/
```

### Contributing Guidelines
1. ๐Ÿด Fork the repository
2. ๐ŸŒŸ Create a feature branch (`git checkout -b feature/amazing-feature`)
3. โœจ Make your changes
4. โœ… Add tests for new functionality
5. ๐Ÿงช Run the test suite (`pytest`)
6. ๐Ÿ“ Update documentation if needed
7. ๐Ÿ’พ Commit your changes (`git commit -m 'Add amazing feature'`)
8. ๐Ÿ“ค Push to the branch (`git push origin feature/amazing-feature`)
9. ๐Ÿ”„ Open a Pull Request

## ๐Ÿ“„ License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## ๐Ÿ‘ฅ Contributors

**Authors:**
- Mahipal Reddy Ramireddy
- M. A. Andrade

**Maintainer:**
- Precision Irrigation Management Lab (PRIMA)

We welcome contributions from the community! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

## โš ๏ธ Disclaimer

This library is not affiliated with the California Department of Water Resources or the CIMIS program. It is an independent client library for accessing the public CIMIS API.

## ๐Ÿ”— Useful Links

- **๏ฟฝ [Python CIMIS Documentation](https://python-cimis.readthedocs.io/)** - Complete library documentation
- **๏ฟฝ๐Ÿ“‹ [CIMIS Website](https://cimis.water.ca.gov/)** - Official CIMIS portal
- **๐Ÿ“– [CIMIS API Documentation](https://et.water.ca.gov/Rest/Index)** - Official API docs
- **๐Ÿ›๏ธ [California Department of Water Resources](https://water.ca.gov/)** - DWR website
- **๐Ÿ› [Report Issues](https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS/issues)** - Bug reports and feature requests
- **๐Ÿ“ฆ [PyPI Package](https://pypi.org/project/python-CIMIS/)** - Package on PyPI

---

**Made with โค๏ธ for the California agricultural and research community**

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS",
    "name": "python-CIMIS",
    "maintainer": "Precision Irrigation Management Lab (PRIMA)",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "\"Precision Irrigation Management Lab (PRIMA)\" <mahipalbablu16@gmail.com>",
    "keywords": "cimis, weather, california, irrigation, agriculture, climate, data, api, meteorology, evapotranspiration",
    "author": "Mahipal Reddy Ramireddy, M. A. Andrade",
    "author_email": "Mahipal Reddy Ramireddy <mahipalbablu16@gmail.com>, \"M. A. Andrade\" <andradea@unr.edu>",
    "download_url": "https://files.pythonhosted.org/packages/75/49/da9aa0d1c60834c5c8ba4dc2d1f33cab7457f73576650fec2077b8c61845/python_cimis-1.3.5.tar.gz",
    "platform": null,
    "description": "# Python CIMIS Client\r\n\r\nA comprehensive Python client library for the California Irrigation Management Information System (CIMIS) API. This library provides easy access to CIMIS weather station data, spatial data, and station information with built-in CSV export functionality.\r\n\r\n[![PyPI version](https://badge.fury.io/py/python-CIMIS.svg)](https://badge.fury.io/py/python-CIMIS)\r\n[![Python versions](https://img.shields.io/pypi/pyversions/python-CIMIS.svg)](https://pypi.org/project/python-CIMIS/)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n[![Documentation Status](https://readthedocs.org/projects/python-cimis/badge/?version=latest)](https://python-cimis.readthedocs.io/en/latest/?badge=latest)\r\n\r\n## \ud83d\udcda Documentation\r\n\r\n**\ud83d\udcd6 [Complete Documentation](https://python-cimis.readthedocs.io/)** - Detailed guides, API reference, and examples\r\n\r\n## \ud83d\udccb Table of Contents\r\n\r\n- [\ud83d\ude80 Quick Start](#-quick-start)\r\n- [\u2728 Features](#-features)\r\n- [\ud83d\udce6 Installation](#-installation)\r\n- [\ud83d\udd11 API Key Setup](#-api-key-setup)\r\n- [\ud83d\udcd6 Usage Examples](#-usage-examples)\r\n  - [Daily Weather Data](#daily-weather-data)\r\n  - [Hourly Weather Data](#hourly-weather-data)\r\n  - [Station Information](#station-information)\r\n  - [CSV Export](#csv-export)\r\n  - [Error Handling](#error-handling)\r\n- [\ud83d\udcca Available Data Items](#-available-data-items)\r\n- [\ud83d\udee0\ufe0f Advanced Usage](#\ufe0f-advanced-usage)\r\n- [\ud83d\udd27 Configuration](#-configuration)\r\n- [\ud83d\udcda API Reference](#-api-reference)\r\n- [\ud83e\udd1d Contributing](#-contributing)\r\n\r\n## \ud83d\ude80 Quick Start\r\n\r\n```python\r\nfrom python_cimis import CimisClient\r\nfrom datetime import date\r\n\r\n# Initialize the client with your API key\r\nclient = CimisClient(app_key=\"your-api-key-here\")\r\n\r\n# Get daily weather data for specific stations\r\nweather_data = client.get_daily_data(\r\n    targets=[2, 8, 127],  # Station numbers\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-05\"\r\n)\r\n\r\n# Export to CSV with all available columns\r\nclient.export_to_csv(weather_data, \"weather_data.csv\")\r\n\r\n# Or get data and export in one step\r\nweather_data = client.get_data_and_export_csv(\r\n    targets=[2, 8, 127],\r\n    start_date=date(2023, 1, 1),\r\n    end_date=date(2023, 1, 5),\r\n    filename=\"comprehensive_weather_data.csv\"\r\n)\r\n```\r\n\r\n## \u2728 Features\r\n\r\n- **\ud83c\udf10 Comprehensive API Coverage**: Access all CIMIS API endpoints including weather data, station information, and zip code data\r\n- **\ud83d\udce1 Multiple Data Sources**: Support for both Weather Station Network (WSN) and Spatial CIMIS System (SCS) data\r\n- **\ud83c\udfaf Flexible Data Retrieval**: Get data by station numbers, zip codes, coordinates, or street addresses\r\n- **\ud83d\udcca Built-in CSV Export**: Export all data with comprehensive column coverage by default\r\n- **\ud83d\udc0d Easy to Use**: Simple, Pythonic interface with sensible defaults\r\n- **\u26a0\ufe0f Error Handling**: Comprehensive exception handling with descriptive error messages\r\n- **\ud83d\udcdd Type Hints**: Full type hint support for better IDE integration\r\n- **\u26a1 Performance**: Efficient data processing and export functionality\r\n\r\n## \ud83d\udce6 Installation\r\n\r\n### From PyPI (Recommended)\r\n\r\n```bash\r\npip install python-CIMIS\r\n```\r\n\r\n### From Source\r\n\r\n```bash\r\ngit clone https://github.com/python-cimis/python-cimis-client.git\r\ncd python-cimis-client\r\npip install -e .\r\n```\r\n\r\n## \ud83d\udd11 API Key Setup\r\n\r\nYou need a CIMIS API key to use this library. \r\n\r\n### Get Your API Key\r\n\r\n1. Visit the [CIMIS website](https://cimis.water.ca.gov/Default.aspx)\r\n2. Register for a free account\r\n3. Generate your API key from your account dashboard\r\n\r\n### Set Up Your API Key\r\n\r\n```python\r\n# Option 1: Pass directly to client (not recommended for production)\r\nclient = CimisClient(app_key=\"your-api-key-here\")\r\n\r\n# Option 2: Use environment variable (recommended)\r\nimport os\r\nos.environ['CIMIS_API_KEY'] = 'your-api-key-here'\r\nclient = CimisClient(app_key=os.getenv('CIMIS_API_KEY'))\r\n\r\n# Option 3: Load from config file\r\nimport json\r\nwith open('config.json') as f:\r\n    config = json.load(f)\r\nclient = CimisClient(app_key=config['cimis_api_key'])\r\n```\r\n\r\n## \ud83d\udcd6 Usage Examples\r\n\r\n### Daily Weather Data\r\n\r\n#### \ud83c\udfed By Station Numbers\r\n\r\n```python\r\nfrom python_cimis import CimisClient\r\nfrom datetime import date, timedelta\r\n\r\nclient = CimisClient(app_key=\"your-api-key-here\")\r\n\r\n# Get data for specific weather stations\r\nweather_data = client.get_daily_data(\r\n    targets=[2, 8, 127],  # Station numbers: Davis, UC Davis, Five Points\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\"\r\n    # unit_of_measure defaults to \"Metric\"\r\n)\r\n\r\nprint(f\"Retrieved {len(weather_data.get_all_records())} records\")\r\n```\r\n\r\n#### \ud83d\udcee By Zip Codes\r\n\r\n```python\r\n# Get data for specific zip codes\r\nweather_data = client.get_daily_data(\r\n    targets=[\"95823\", \"94503\", \"93624\"],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\",\r\n    prioritize_scs=True  # Prioritize Spatial CIMIS System data\r\n)\r\n\r\n# Export to CSV\r\nclient.export_to_csv(weather_data, \"zip_code_weather.csv\")\r\n```\r\n\r\n#### \ud83d\uddfa\ufe0f By Coordinates\r\n\r\n```python\r\n# Get data for specific coordinates (latitude, longitude)\r\nweather_data = client.get_data(\r\n    targets=[\r\n        \"lat=39.36,lng=-121.74\",  # Near Yuba City\r\n        \"lat=38.22,lng=-122.82\"   # Near Santa Rosa\r\n    ],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\",\r\n    data_items=[\"day-asce-eto\", \"day-sol-rad-avg\"]  # Only ETo and solar radiation\r\n)\r\n```\r\n\r\n#### \ud83c\udfe0 By Addresses\r\n\r\n```python\r\n# Get data for specific addresses\r\nweather_data = client.get_data(\r\n    targets=[\r\n        \"addr-name=State Capitol,addr=1315 10th Street Sacramento, CA 95814\",\r\n        \"addr-name=SF City Hall,addr=1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102\"\r\n    ],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\",\r\n    data_items=[\"day-asce-eto\", \"day-sol-rad-avg\"]\r\n)\r\n```\r\n\r\n### Hourly Weather Data\r\n\r\n```python\r\n# Get hourly data (only available from WSN stations)\r\n# Note: Hourly data requests should be for shorter periods due to data volume\r\nfrom datetime import datetime, timedelta\r\n\r\nyesterday = datetime.now() - timedelta(days=1)\r\nstart_date = yesterday.strftime('%Y-%m-%d')\r\nend_date = start_date  # Same day for hourly data\r\n\r\nhourly_data = client.get_hourly_data(\r\n    targets=[2, 8, 127],\r\n    start_date=start_date,\r\n    end_date=end_date\r\n)\r\n\r\n# Export hourly data (automatically uses clean column names)\r\nclient.export_to_csv(hourly_data, \"hourly_weather.csv\")\r\n```\r\n\r\n### Station Information\r\n\r\n```python\r\n# Get all available stations\r\nall_stations = client.get_stations()\r\nprint(f\"Total stations: {len(all_stations)}\")\r\n\r\n# Get specific station information\r\nstation = client.get_stations(station_number=\"2\")\r\nprint(f\"Station: {station[0].name} in {station[0].city}\")\r\n\r\n# Export station information to CSV\r\nclient.export_stations_to_csv(all_stations, \"all_stations.csv\")\r\n\r\n# Get zip code information\r\nstation_zips = client.get_station_zip_codes()\r\nspatial_zips = client.get_spatial_zip_codes()\r\n```\r\n\r\n### CSV Export\r\n\r\n```python\r\n# Basic export with all columns (default)\r\nclient.export_to_csv(weather_data, \"complete_data.csv\")\r\n\r\n# Export with automatic filename generation\r\nfilename = client.export_to_csv(weather_data)\r\nprint(f\"Data exported to: {filename}\")\r\n\r\n# Export daily and hourly data separately (recommended)\r\nmixed_data = client.get_data(\r\n    targets=[2, 8],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-02\"\r\n)\r\nresult = client.export_to_csv(mixed_data, \"weather_data.csv\")\r\n# Creates: weather_data_daily.csv and weather_data_hourly.csv\r\n\r\n# One-step data retrieval and export\r\nclient.get_data_and_export_csv(\r\n    targets=[2, 8, 127],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-05\",\r\n    filename=\"january_weather.csv\"\r\n)\r\n```\r\n\r\n### Error Handling\r\n\r\n```python\r\nfrom python_cimis import (\r\n    CimisClient, \r\n    CimisAPIError, \r\n    CimisAuthenticationError,\r\n    CimisDataError,\r\n    CimisConnectionError\r\n)\r\n\r\nclient = CimisClient(\"your-api-key\")\r\n\r\ntry:\r\n    weather_data = client.get_daily_data(\r\n        targets=[999999],  # Invalid station\r\n        start_date=\"2023-01-01\",\r\n        end_date=\"2023-01-01\"\r\n    )\r\nexcept CimisAuthenticationError:\r\n    print(\"\u274c Invalid API key or authentication failed\")\r\nexcept CimisConnectionError:\r\n    print(\"\u274c Network connection error\")\r\nexcept CimisDataError as e:\r\n    print(f\"\u274c Data error: {e}\")\r\nexcept CimisAPIError as e:\r\n    print(f\"\u274c API Error: {e}\")\r\nexcept Exception as e:\r\n    print(f\"\u274c Unexpected error: {e}\")\r\n```\r\n\r\n### Custom Data Items\r\n\r\n```python\r\n# Specify custom data items for specific needs\r\ntemperature_only = [\r\n    \"day-air-tmp-avg\", \r\n    \"day-air-tmp-max\", \r\n    \"day-air-tmp-min\"\r\n]\r\n\r\neto_and_weather = [\r\n    \"day-asce-eto\",\r\n    \"day-precip\", \r\n    \"day-sol-rad-avg\",\r\n    \"day-wind-spd-avg\",\r\n    \"day-rel-hum-avg\"\r\n]\r\n\r\n# Get only temperature data\r\ntemp_data = client.get_daily_data(\r\n    targets=[2, 8, 127],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\",\r\n    data_items=temperature_only\r\n)\r\n\r\n# Get ETo calculation inputs\r\neto_data = client.get_daily_data(\r\n    targets=[2, 8, 127],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\",\r\n    data_items=eto_and_weather\r\n)\r\n```\r\n\r\n## \ud83d\udcca Available Data Items\r\n\r\n### \ud83c\udf05 Daily Data Items (WSN + SCS)\r\n\r\n| Category | Data Items | Description |\r\n|----------|------------|-------------|\r\n| **\ud83c\udf21\ufe0f Temperature** | `day-air-tmp-avg`, `day-air-tmp-max`, `day-air-tmp-min` | Average, maximum, and minimum air temperature |\r\n| **\ud83d\udca7 Humidity** | `day-rel-hum-avg`, `day-rel-hum-max`, `day-rel-hum-min` | Relative humidity measurements |\r\n| **\ud83c\udf3f Evapotranspiration** | `day-eto`, `day-asce-eto`, `day-asce-etr` | Reference evapotranspiration calculations |\r\n| **\u2600\ufe0f Solar Radiation** | `day-sol-rad-avg`, `day-sol-rad-net` | Solar radiation measurements |\r\n| **\ud83d\udca8 Wind** | `day-wind-spd-avg`, `day-wind-run` | Wind speed and directional components |\r\n| **\ud83c\udf0d Soil** | `day-soil-tmp-avg`, `day-soil-tmp-max`, `day-soil-tmp-min` | Soil temperature at various depths |\r\n| **\ud83c\udf27\ufe0f Other** | `day-precip`, `day-dew-pnt`, `day-vap-pres-avg` | Precipitation, dew point, vapor pressure |\r\n\r\n### \u23f0 Hourly Data Items (WSN only)\r\n\r\n| Category | Data Items | Description |\r\n|----------|------------|-------------|\r\n| **\ud83c\udf21\ufe0f Temperature** | `hly-air-tmp`, `hly-soil-tmp` | Hourly air and soil temperature |\r\n| **\ud83d\udca7 Humidity** | `hly-rel-hum` | Hourly relative humidity |\r\n| **\ud83c\udf3f Evapotranspiration** | `hly-eto`, `hly-asce-eto`, `hly-asce-etr` | Hourly ET calculations |\r\n| **\u2600\ufe0f Solar** | `hly-sol-rad`, `hly-net-rad` | Hourly solar radiation |\r\n| **\ud83d\udca8 Wind** | `hly-wind-spd`, `hly-wind-dir`, `hly-res-wind` | Hourly wind measurements |\r\n| **\ud83c\udf27\ufe0f Other** | `hly-precip`, `hly-dew-pnt`, `hly-vap-pres` | Hourly precipitation and atmospheric data |\r\n\r\n> **\ud83d\udcdd Note**: When exporting hourly data to CSV, column names automatically have the \"Hly\" prefix removed for cleaner formatting (e.g., `HlyAirTmp` becomes `AirTmp_Value`).\r\n\r\n## \ud83d\udee0\ufe0f Advanced Usage\r\n\r\n### Batch Processing Multiple Locations\r\n\r\n```python\r\nfrom concurrent.futures import ThreadPoolExecutor\r\nimport pandas as pd\r\n\r\ndef get_station_data(station_id):\r\n    \"\"\"Get data for a single station\"\"\"\r\n    try:\r\n        data = client.get_daily_data(\r\n            targets=[station_id],\r\n            start_date=\"2023-01-01\",\r\n            end_date=\"2023-01-31\"\r\n        )\r\n        return station_id, data\r\n    except Exception as e:\r\n        print(f\"Error for station {station_id}: {e}\")\r\n        return station_id, None\r\n\r\n# Process multiple stations in parallel\r\nstations = [2, 8, 127, 54, 6]\r\nresults = {}\r\n\r\nwith ThreadPoolExecutor(max_workers=3) as executor:\r\n    futures = [executor.submit(get_station_data, station) for station in stations]\r\n    for future in futures:\r\n        station_id, data = future.result()\r\n        if data:\r\n            results[station_id] = data\r\n```\r\n\r\n### Data Analysis Integration\r\n\r\n```python\r\nimport pandas as pd\r\nimport matplotlib.pyplot as plt\r\n\r\n# Get weather data\r\nweather_data = client.get_daily_data(\r\n    targets=[2],  # Davis station\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-12-31\",\r\n    data_items=[\"day-air-tmp-avg\", \"day-asce-eto\", \"day-precip\"]\r\n)\r\n\r\n# Export to CSV\r\ncsv_file = client.export_to_csv(weather_data, \"davis_2023.csv\")\r\n\r\n# Load into pandas for analysis\r\ndf = pd.read_csv(csv_file)\r\ndf['Date'] = pd.to_datetime(df['Date'])\r\n\r\n# Basic analysis\r\nprint(f\"Average temperature: {df['DayAirTmpAvg_Value'].mean():.1f}\u00b0C\")\r\nprint(f\"Total precipitation: {df['DayPrecip_Value'].sum():.1f}mm\")\r\nprint(f\"Total ETo: {df['DayAsceEto_Value'].sum():.1f}mm\")\r\n\r\n# Simple visualization\r\nplt.figure(figsize=(12, 6))\r\nplt.plot(df['Date'], df['DayAirTmpAvg_Value'])\r\nplt.title('Daily Average Temperature - Davis Station 2023')\r\nplt.ylabel('Temperature (\u00b0C)')\r\nplt.xticks(rotation=45)\r\nplt.tight_layout()\r\nplt.show()\r\n```\r\n\r\n### Custom Data Validation\r\n\r\n```python\r\ndef validate_weather_data(weather_data):\r\n    \"\"\"Validate weather data quality\"\"\"\r\n    records = weather_data.get_all_records()\r\n    \r\n    issues = []\r\n    for record in records:\r\n        # Check for missing critical data\r\n        if 'DayAsceEto' in record.data_values:\r\n            eto_value = record.data_values['DayAsceEto'].value\r\n            qc_flag = record.data_values['DayAsceEto'].qc\r\n            \r\n            if not eto_value or eto_value == '':\r\n                issues.append(f\"Missing ETo data for {record.date}\")\r\n            elif qc_flag and qc_flag.strip() not in [' ', '']:\r\n                issues.append(f\"Quality issue for ETo on {record.date}: {qc_flag}\")\r\n    \r\n    return issues\r\n\r\n# Use validation\r\nweather_data = client.get_daily_data(targets=[2], start_date=\"2023-01-01\", end_date=\"2023-01-31\")\r\nissues = validate_weather_data(weather_data)\r\nif issues:\r\n    print(\"Data quality issues found:\")\r\n    for issue in issues[:5]:  # Show first 5 issues\r\n        print(f\"  - {issue}\")\r\n```\r\n\r\n## \ud83d\udd27 Configuration\r\n\r\n### Environment Variables\r\n\r\n```bash\r\n# Set your API key as an environment variable (recommended)\r\nexport CIMIS_API_KEY=\"your-api-key-here\"\r\n\r\n# Optional: Set default timeout\r\nexport CIMIS_TIMEOUT=\"30\"\r\n```\r\n\r\n### Client Configuration\r\n\r\n```python\r\n# Configure client with custom settings\r\nclient = CimisClient(\r\n    app_key=\"your-api-key\",\r\n    timeout=60,  # Custom timeout in seconds\r\n    base_url=\"https://et.water.ca.gov/api\"  # Custom base URL if needed\r\n)\r\n\r\n# Check client configuration\r\nprint(f\"API Key configured: {'Yes' if client.app_key else 'No'}\")\r\nprint(f\"Timeout: {client.timeout} seconds\")\r\n```\r\n\r\n## \ud83d\udcda API Reference\r\n\r\n### CimisClient Class\r\n\r\n```python\r\nfrom python_cimis import CimisClient\r\n\r\nclient = CimisClient(\r\n    app_key: str,           # Your CIMIS API key (required)\r\n    timeout: int = 30,      # Request timeout in seconds\r\n    base_url: str = None    # Custom API base URL (optional)\r\n)\r\n```\r\n\r\n### Main Methods\r\n\r\n| Method | Description | Returns |\r\n|--------|-------------|---------|\r\n| `get_daily_data()` | Get daily weather data | `WeatherData` object |\r\n| `get_hourly_data()` | Get hourly weather data | `WeatherData` object |\r\n| `get_data()` | Get weather data (flexible) | `WeatherData` object |\r\n| `get_stations()` | Get station information | `List[Station]` |\r\n| `get_station_zip_codes()` | Get WSN zip codes | `List[ZipCode]` |\r\n| `get_spatial_zip_codes()` | Get SCS zip codes | `List[SpatialZipCode]` |\r\n| `export_to_csv()` | Export data to CSV | `str` (filename) |\r\n| `export_stations_to_csv()` | Export stations to CSV | `str` (filename) |\r\n| `get_data_and_export_csv()` | Get data and export in one step | `Tuple[WeatherData, str]` |\r\n\r\n### Method Parameters\r\n\r\n#### get_daily_data() / get_hourly_data()\r\n\r\n```python\r\nclient.get_daily_data(\r\n    targets: Union[str, List[str]],           # Station numbers, zip codes, coordinates\r\n    start_date: Union[str, date, datetime],   # Start date (YYYY-MM-DD)\r\n    end_date: Union[str, date, datetime],     # End date (YYYY-MM-DD)\r\n    data_items: Optional[List[str]] = None,   # Specific data items (optional)\r\n    unit_of_measure: str = 'Metric',          # 'Metric' or 'English'\r\n    csv: bool = False,                        # Export to CSV immediately\r\n    filename: Optional[str] = None            # CSV filename (if csv=True)\r\n)\r\n```\r\n\r\n## \ud83e\udde9 Data Models\r\n\r\n### WeatherData\r\nContainer for weather data responses with methods:\r\n- `get_all_records()`: Get all weather records\r\n- `get_daily_records()`: Get only daily records  \r\n- `get_hourly_records()`: Get only hourly records\r\n\r\n### WeatherRecord\r\nIndividual weather data record with attributes:\r\n- `date`: Record date (YYYY-MM-DD)\r\n- `station`: Station identifier\r\n- `data_values`: Dictionary of data measurements\r\n- `scope`: 'daily' or 'hourly'\r\n\r\n### Station\r\nWeather station information with attributes:\r\n- `station_nbr`: Station number\r\n- `name`: Station name\r\n- `city`: City location\r\n- `latitude`, `longitude`: Coordinates\r\n- `elevation`: Station elevation\r\n\r\n## \ud83d\udca1 Best Practices\r\n\r\n### 1. API Key Security\r\n```python\r\n# \u2705 Good: Use environment variables\r\nimport os\r\nclient = CimisClient(app_key=os.getenv('CIMIS_API_KEY'))\r\n\r\n# \u274c Avoid: Hardcoding API keys\r\nclient = CimisClient(app_key=\"your-key-here\")  # Don't do this!\r\n```\r\n\r\n### 2. Date Range Management\r\n```python\r\n# \u2705 Good: Reasonable date ranges\r\nfrom datetime import date, timedelta\r\n\r\n# For daily data: up to 1 year\r\nstart_date = date.today() - timedelta(days=365)\r\nend_date = date.today() - timedelta(days=1)\r\n\r\n# For hourly data: keep it short (1-7 days)\r\nstart_date = date.today() - timedelta(days=1)\r\nend_date = date.today() - timedelta(days=1)\r\n```\r\n\r\n### 3. Error Handling\r\n```python\r\n# \u2705 Good: Comprehensive error handling\r\nfrom python_cimis import CimisClient, CimisAPIError\r\n\r\ntry:\r\n    weather_data = client.get_daily_data(targets=[2], start_date=\"2023-01-01\", end_date=\"2023-01-31\")\r\nexcept CimisAPIError as e:\r\n    print(f\"API Error: {e}\")\r\n    # Handle error appropriately\r\n```\r\n\r\n### 4. Performance Optimization\r\n```python\r\n# \u2705 Good: Request specific data items when possible\r\ndata_items = [\"day-asce-eto\", \"day-precip\", \"day-air-tmp-avg\"]\r\nweather_data = client.get_daily_data(\r\n    targets=[2, 8, 127],\r\n    start_date=\"2023-01-01\",\r\n    end_date=\"2023-01-31\",\r\n    data_items=data_items  # Reduces response size\r\n)\r\n```\r\n\r\n## Requirements\r\n\r\n- **Python**: 3.8+\r\n- **Dependencies**: \r\n  - requests >= 2.25.0\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\nContributions are welcome! Here's how you can help:\r\n\r\n### Development Setup\r\n```bash\r\n# Clone the repository\r\ngit clone https://github.com/python-cimis/python-cimis-client.git\r\ncd python-cimis-client\r\n\r\n# Create virtual environment\r\npython -m venv venv\r\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\r\n\r\n# Install development dependencies\r\npip install -e \".[dev]\"\r\n\r\n# Run tests\r\npytest\r\n\r\n# Run linting\r\nblack python_cimis/\r\nflake8 python_cimis/\r\nmypy python_cimis/\r\n```\r\n\r\n### Contributing Guidelines\r\n1. \ud83c\udf74 Fork the repository\r\n2. \ud83c\udf1f Create a feature branch (`git checkout -b feature/amazing-feature`)\r\n3. \u2728 Make your changes\r\n4. \u2705 Add tests for new functionality\r\n5. \ud83e\uddea Run the test suite (`pytest`)\r\n6. \ud83d\udcdd Update documentation if needed\r\n7. \ud83d\udcbe Commit your changes (`git commit -m 'Add amazing feature'`)\r\n8. \ud83d\udce4 Push to the branch (`git push origin feature/amazing-feature`)\r\n9. \ud83d\udd04 Open a Pull Request\r\n\r\n## \ud83d\udcc4 License\r\n\r\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\r\n\r\n## \ud83d\udc65 Contributors\r\n\r\n**Authors:**\r\n- Mahipal Reddy Ramireddy\r\n- M. A. Andrade\r\n\r\n**Maintainer:**\r\n- Precision Irrigation Management Lab (PRIMA)\r\n\r\nWe welcome contributions from the community! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\r\n\r\n## \u26a0\ufe0f Disclaimer\r\n\r\nThis library is not affiliated with the California Department of Water Resources or the CIMIS program. It is an independent client library for accessing the public CIMIS API.\r\n\r\n## \ud83d\udd17 Useful Links\r\n\r\n- **\ufffd [Python CIMIS Documentation](https://python-cimis.readthedocs.io/)** - Complete library documentation\r\n- **\ufffd\ud83d\udccb [CIMIS Website](https://cimis.water.ca.gov/)** - Official CIMIS portal\r\n- **\ud83d\udcd6 [CIMIS API Documentation](https://et.water.ca.gov/Rest/Index)** - Official API docs\r\n- **\ud83c\udfdb\ufe0f [California Department of Water Resources](https://water.ca.gov/)** - DWR website\r\n- **\ud83d\udc1b [Report Issues](https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS/issues)** - Bug reports and feature requests\r\n- **\ud83d\udce6 [PyPI Package](https://pypi.org/project/python-CIMIS/)** - Package on PyPI\r\n\r\n---\r\n\r\n**Made with \u2764\ufe0f for the California agricultural and research community**\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A comprehensive Python client for the California Irrigation Management Information System (CIMIS) API",
    "version": "1.3.5",
    "project_urls": {
        "Bug Reports": "https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS/issues",
        "Documentation": "https://python-cimis.readthedocs.io/",
        "Download": "https://pypi.org/project/python-CIMIS/",
        "Homepage": "https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS",
        "Repository": "https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS",
        "Source Code": "https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS",
        "Tracker": "https://github.com/Precision-Irrigation-Management-lab/Python-CIMIS/issues"
    },
    "split_keywords": [
        "cimis",
        " weather",
        " california",
        " irrigation",
        " agriculture",
        " climate",
        " data",
        " api",
        " meteorology",
        " evapotranspiration"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f85bbf02d9322724aefaddd6f90adc4a1b1d3aca01994a07cdbcd7dec933f071",
                "md5": "1429e6824b4333446aa8b3583f9871ff",
                "sha256": "0d814adbd8c74b2563fe35b90f2264db4b80cc178c623749a22aa6ccd58a74cf"
            },
            "downloads": -1,
            "filename": "python_cimis-1.3.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1429e6824b4333446aa8b3583f9871ff",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 27660,
            "upload_time": "2025-07-20T17:31:24",
            "upload_time_iso_8601": "2025-07-20T17:31:24.904235Z",
            "url": "https://files.pythonhosted.org/packages/f8/5b/bf02d9322724aefaddd6f90adc4a1b1d3aca01994a07cdbcd7dec933f071/python_cimis-1.3.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7549da9aa0d1c60834c5c8ba4dc2d1f33cab7457f73576650fec2077b8c61845",
                "md5": "df4cd1c051f275dff404f1ab492eb8ae",
                "sha256": "98801142a8ea2380e5b0b7789316cbfa379beb87ad543f5ece3fe7aecc768400"
            },
            "downloads": -1,
            "filename": "python_cimis-1.3.5.tar.gz",
            "has_sig": false,
            "md5_digest": "df4cd1c051f275dff404f1ab492eb8ae",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 55427,
            "upload_time": "2025-07-20T17:31:26",
            "upload_time_iso_8601": "2025-07-20T17:31:26.167206Z",
            "url": "https://files.pythonhosted.org/packages/75/49/da9aa0d1c60834c5c8ba4dc2d1f33cab7457f73576650fec2077b8c61845/python_cimis-1.3.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-20 17:31:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Precision-Irrigation-Management-lab",
    "github_project": "Python-CIMIS",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "requests",
            "specs": [
                [
                    ">=",
                    "2.25.0"
                ]
            ]
        }
    ],
    "lcname": "python-cimis"
}
        
Elapsed time: 0.55375s