def read_crn(filename):
<EOL>data = pd.read_fwf(filename, header=None, names=HEADERS.split('<STR_LIT:U+0020>'),<EOL>widths=WIDTHS)<EOL>for (col, _dtype) in zip(data.columns, DTYPES):<EOL><INDENT>data[col] = data[col].astype(_dtype)<EOL><DEDENT>dts = data[['<STR_LIT>', '<STR_LIT>']].astype(str)<EOL>dtindex = pd.to_datetime(dts['<STR_LIT>'] + dts['<STR_LIT>'].str.zfill(<NUM_LIT:4>),<EOL>format='<STR_LIT>', utc=True)<EOL>data = data.set_index(dtindex)<EOL>try:<EOL><INDENT>data = data.tz_localize('<STR_LIT>')<EOL><DEDENT>except TypeError:<EOL><INDENT>pass<EOL><DEDENT>for val in [-<NUM_LIT>, -<NUM_LIT>, -<NUM_LIT>]:<EOL><INDENT>data = data.where(data != val, np.nan)<EOL><DEDENT>data = data.rename(columns=VARIABLE_MAP)<EOL>return data<EOL>
Read NOAA USCRN [1]_ [2]_ fixed-width file into pandas dataframe.

Parameters
----------
filename: str
    filepath or url to read for the fixed-width file.

Returns
-------
data: Dataframe
    A dataframe with DatetimeIndex and all of the variables in the
    file.

Notes
-----
CRN files contain 5 minute averages labeled by the interval ending
time. Here, missing data is flagged as NaN, rather than the lowest
possible integer for a field (e.g. -999 or -99). Air temperature in
deg C. Wind speed in m/s at a height of 1.5 m above ground level.

Variables corresponding to standard pvlib variables are renamed,
e.g. `SOLAR_RADIATION` becomes `ghi`. See the
`pvlib.iotools.crn.VARIABLE_MAP` dict for the complete mapping.

References
----------
.. [1] U.S. Climate Reference Network
   `https://www.ncdc.noaa.gov/crn/qcdatasets.html
   <https://www.ncdc.noaa.gov/crn/qcdatasets.html>`_

.. [2] Diamond, H. J. et. al., 2013: U.S. Climate Reference Network
   after one decade of operations: status and assessment. Bull.
   Amer. Meteor. Soc., 94, 489-498. :doi:`10.1175/BAMS-D-12-00170.1`