#!/usr/bin/env python
# -*- coding: utf-8 -*-.
# Full license can be found in License.md
# Full author list can be found in .zenodo.json file
# DOI:10.5281/zenodo.3986138
# ----------------------------------------------------------------------------
"""Supports solar radio flux values from the Nobeyama Radio Polarimeters.
Properties
----------
platform
'norp'
name
'rf'
tag
- 'daily' Daily solar flux values from 1951-11-01 onward
inst_id
- None supported
Examples
--------
Download and load all of the daily radio flux data.
::
rf = pysat.Instrument('norp', 'rf', tag='daily')
rf.download(start=dt.datetime(1951, 11, 1), stop=rf.today())
rf.load(date=dt.datetime(1951, 11, 1), end_date=rf.today())
"""
import datetime as dt
import numpy as np
import pandas as pds
import pysat
from pysatSpaceWeather.instruments import methods
# ----------------------------------------------------------------------------
# Instrument attributes
platform = 'norp'
name = 'rf'
tags = {'daily': 'Daily solar flux values'}
inst_ids = {'': [tag for tag in tags.keys()]}
# ----------------------------------------------------------------------------
# Instrument test attributes
_test_dates = {'': {'daily': dt.datetime(1951, 11, 1)}}
# ----------------------------------------------------------------------------
# Instrument methods
preprocess = methods.general.preprocess
[docs]
def init(self):
"""Initialize the Instrument object with instrument specific values."""
# Set the required Instrument attributes
self.acknowledgements = methods.norp.acknowledgements()
self.references = methods.norp.references(self.name, self.tag)
pysat.logger.info(self.acknowledgements)
return
[docs]
def clean(self):
"""Clean the solar radio flux, empty function as this is not necessary."""
return
# ----------------------------------------------------------------------------
# Instrument functions
[docs]
def load(fnames, tag='', inst_id=''):
"""Load NoRP solar radio flux files.
Parameters
----------
fnames : pandas.Series
Series of filenames.
tag : str
Instrument tag. (default='')
inst_id : str
Instrument ID, not used. (default='')
Returns
-------
data : pandas.DataFrame
Object containing satellite data.
meta : pysat.Meta
Object containing metadata such as column names and units.
See Also
--------
pysat.instruments.methods.general.load_csv_data
Note
----
Called by pysat. Not intended for direct use by user.
"""
# Get the desired file dates and file names from the daily indexed list
file_dates = list()
if tag in ['daily']:
unique_files = list()
for fname in fnames:
file_dates.append(dt.datetime.strptime(fname[-10:], '%Y-%m-%d'))
if fname[0:-11] not in unique_files:
unique_files.append(fname[0:-11])
fnames = unique_files
# Load the CSV data files
data = pysat.instruments.methods.general.load_csv_data(
fnames, read_csv_kwargs={"index_col": 0, "parse_dates": True})
# If there is a date range, downselect here
if len(file_dates) > 0:
idx, = np.where((data.index >= min(file_dates))
& (data.index < max(file_dates) + dt.timedelta(days=1)))
data = data.iloc[idx, :]
# Initialize the metadata
meta = pysat.Meta()
for col in data.columns:
meta[col] = {
meta.labels.units: 'SFU', meta.labels.notes: '',
meta.labels.name: 'NoRP solar sadio flux {:} w/AU corr'.format(
col.replace("_", " ")),
meta.labels.desc: ''.join([
'NoRP solar radio flux at ', col.replace("_", " "),
' with Astronomical Unit (AU) correction in Solar Flux Units',
' (SFU).']),
meta.labels.fill_val: np.nan,
meta.labels.min_val: 0, meta.labels.max_val: np.inf}
return data, meta
[docs]
def list_files(tag='', inst_id='', data_path='', format_str=None):
"""List local NoRP solar radio flux data files.
Parameters
----------
tag : str
Instrument tag, accepts any value from `tags`. (default='')
inst_id : str
Instrument ID, not used. (default='')
data_path : str
Path to data directory. (default='')
format_str : str or NoneType
User specified file format. If None is specified, the default
formats associated with the supplied tags are used. (default=None)
Returns
-------
out_files : pds.Series
A Series containing the verified available files
Note
----
Called by pysat. Not intended for direct use by user.
"""
# Files are by month, going to add date to monthly filename for each day of
# the month. The load routine will load a month of data and use the
# appended date to select out appropriate data.
if format_str is None:
format_str = "_".join(["norp", "rf", tag, '{year:04d}-{month:02d}.txt'])
out_files = pysat.Files.from_os(data_path=data_path, format_str=format_str)
if not out_files.empty:
out_files.loc[out_files.index[-1] + pds.DateOffset(months=1)
- pds.DateOffset(days=1)] = out_files.iloc[-1]
out_files = out_files.asfreq('D', 'pad')
out_files = out_files + '_' + out_files.index.strftime('%Y-%m-%d')
return out_files
[docs]
def download(date_array, tag, inst_id, data_path, update_files=False,
mock_download_dir=None):
"""Download NoRP solar radio flux data.
Parameters
----------
date_array : array-like
Sequence of dates for which files will be downloaded.
tag : str
Denotes type of file to load.
inst_id : str
Specifies the satellite ID for a constellation.
data_path : str
Path to data directory.
update_files : bool
Re-download data for files that already exist if True (default=False)
mock_download_dir : str or NoneType
Local directory with downloaded files or None. If not None, will
process any files with the correct name and date as if they were
downloaded (default=None)
Raises
------
IOError
If a problem is encountered connecting to the gateway or retrieving
data from the remote or local repository.
Note
----
Called by pysat. Not intended for direct use by user.
"""
# Download the daily radio flux data from NoRP, saving data in monthly files
methods.norp.daily_rf_downloads(data_path,
mock_download_dir=mock_download_dir,
start=date_array[0], stop=date_array[-1])
return