def _parse_hdus(cls, hdulist): """ Parses a GOES/XRS FITS `~astropy.io.fits.HDUList` from a FITS file. Parameters ---------- hdulist : `astropy.io.fits.HDUList` A HDU list. """ header = MetaDict(OrderedDict(hdulist[0].header)) if len(hdulist) == 4: if is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = Time.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%y'): start_time = Time.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = hdulist[2].data['FLUX'][0][:, 0] xrsa = hdulist[2].data['FLUX'][0][:, 1] # TODO how to extract quality flags from HDU? seconds_from_start = hdulist[2].data['TIME'][0] elif 1 <= len(hdulist) <= 3: start_time = parse_time(header['TIMEZERO'], format='utime') seconds_from_start = hdulist[0].data[0] xrsb = hdulist[0].data[1] xrsa = hdulist[0].data[2] else: raise ValueError("Don't know how to parse this file") times = start_time + TimeDelta(seconds_from_start * u.second) times.precision = 9 # remove bad values as defined in header comments xrsb[xrsb == -99999] = np.nan xrsa[xrsa == -99999] = np.nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({ 'xrsa': newxrsa, 'xrsb': newxrsb }, index=times.isot.astype('datetime64')) data.sort_index(inplace=True) # Add the units units = OrderedDict([('xrsa', u.W / u.m**2), ('xrsb', u.W / u.m**2)]) return data, header, units
def _parse_hdus(cls, hdulist): """ Parses a GOES/XRS FITS `~astropy.io.fits.HDUList` from a FITS file. Parameters ---------- hdulist : `astropy.io.fits.HDUList` A HDU list. """ header = MetaDict(OrderedDict(hdulist[0].header)) if len(hdulist) == 4: if is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = Time.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%y'): start_time = Time.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = hdulist[2].data['FLUX'][0][:, 0] xrsa = hdulist[2].data['FLUX'][0][:, 1] seconds_from_start = hdulist[2].data['TIME'][0] elif 1 <= len(hdulist) <= 3: start_time = parse_time(header['TIMEZERO'], format='utime') seconds_from_start = hdulist[0].data[0] xrsb = hdulist[0].data[1] xrsa = hdulist[0].data[2] else: raise ValueError("Don't know how to parse this file") times = start_time + TimeDelta(seconds_from_start*u.second) times.precision = 9 # remove bad values as defined in header comments xrsb[xrsb == -99999] = np.nan xrsa[xrsa == -99999] = np.nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times.isot.astype('datetime64')) data.sort_index(inplace=True) # Add the units units = OrderedDict([('xrsa', u.W/u.m**2), ('xrsb', u.W/u.m**2)]) return data, header, units
def _parse_hdus(cls, hdulist): header = MetaDict(OrderedDict(hdulist[0].header)) if len(hdulist) == 4: if is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = datetime.datetime.strptime( hdulist[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%y'): start_time = datetime.datetime.strptime( hdulist[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = hdulist[2].data['FLUX'][0][:, 0] xrsa = hdulist[2].data['FLUX'][0][:, 1] seconds_from_start = hdulist[2].data['TIME'][0] elif 1 <= len(hdulist) <= 3: start_time = parse_time(header['TIMEZERO']) seconds_from_start = hdulist[0].data[0] xrsb = hdulist[0].data[1] xrsa = hdulist[0].data[2] else: raise ValueError("Don't know how to parse this file") times = [ start_time + datetime.timedelta(seconds=int(np.floor(s)), microseconds=int( (s - np.floor(s)) * 1e6)) for s in seconds_from_start ] # remove bad values as defined in header comments xrsb[xrsb == -99999] = np.nan xrsa[xrsa == -99999] = np.nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times) data.sort_index(inplace=True) # Add the units units = OrderedDict([('xrsa', u.W / u.m**2), ('xrsb', u.W / u.m**2)]) return data, header, units
def _parse_fits(filepath): """Parses a GOES FITS file from http://umbra.nascom.nasa.gov/goes/fits/""" fits = pyfits.open(filepath) header = fits[0].header if len(fits) == 4: if is_time_in_given_format(fits[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = datetime.datetime.strptime( fits[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(fits[0].header['DATE-OBS'], '%d/%m/%y'): start_time = datetime.datetime.strptime( fits[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = fits[2].data['FLUX'][0][:, 0] xrsa = fits[2].data['FLUX'][0][:, 1] seconds_from_start = fits[2].data['TIME'][0] elif 1 <= len(fits) <= 3: start_time = parse_time(header['TIMEZERO']) seconds_from_start = fits[0].data[0] xrsb = fits[0].data[1] xrsa = fits[0].data[2] else: raise ValueError("Don't know how to parse this file") times = [ start_time + datetime.timedelta(seconds=int(floor(s)), microseconds=int( (s - floor(s)) * 1e6)) for s in seconds_from_start ] # remove bad values as defined in header comments xrsb[xrsb == -99999] = nan xrsa[xrsa == -99999] = nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times) return header, data
def _parse_hdus(cls, hdulist): header = MetaDict(OrderedDict(hdulist[0].header)) if len(hdulist) == 4: if is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = datetime.datetime.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%y'): start_time = datetime.datetime.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = hdulist[2].data['FLUX'][0][:, 0] xrsa = hdulist[2].data['FLUX'][0][:, 1] seconds_from_start = hdulist[2].data['TIME'][0] elif 1 <= len(hdulist) <= 3: start_time = parse_time(header['TIMEZERO']) seconds_from_start = hdulist[0].data[0] xrsb = hdulist[0].data[1] xrsa = hdulist[0].data[2] else: raise ValueError("Don't know how to parse this file") times = [start_time + datetime.timedelta(seconds=int(np.floor(s)), microseconds=int((s - np.floor(s)) * 1e6)) for s in seconds_from_start] # remove bad values as defined in header comments xrsb[xrsb == -99999] = np.nan xrsa[xrsa == -99999] = np.nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times) data.sort_index(inplace=True) # Add the units units = OrderedDict([('xrsa', u.W/u.m**2), ('xrsb', u.W/u.m**2)]) return data, header, units
def _parse_fits(filepath): """Parses a GOES FITS file from http://umbra.nascom.nasa.gov/goes/fits/""" fits = pyfits.open(filepath) header = fits[0].header if len(fits) == 4: if is_time_in_given_format(fits[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = datetime.datetime.strptime(fits[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(fits[0].header['DATE-OBS'], '%d/%m/%y'): start_time = datetime.datetime.strptime(fits[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = fits[2].data['FLUX'][0][:, 0] xrsa = fits[2].data['FLUX'][0][:, 1] seconds_from_start = fits[2].data['TIME'][0] elif 1 <= len(fits) <= 3: start_time = parse_time(header['TIMEZERO']) seconds_from_start = fits[0].data[0] xrsb = fits[0].data[1] xrsa = fits[0].data[2] else: raise ValueError("Don't know how to parse this file") times = [start_time + datetime.timedelta(seconds=int(floor(s)), microseconds=int((s - floor(s)) * 1e6)) for s in seconds_from_start] # remove bad values as defined in header comments xrsb[xrsb == -99999] = nan xrsa[xrsa == -99999] = nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times) data.sort(inplace=True) return header, data
def test_is_time_in_given_format(): assert is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%d %H:%M:%S.%f") is True assert is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%dT%H:%M:%S.%f") is False
def test_is_time_in_given_format(): assert is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%d %H:%M:%S.%f") is True assert is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%dT%H:%M:%S.%f") is False