SciTools / iris

A powerful, format-agnostic, and community-driven Python package for analysing and visualising Earth science data
https://scitools-iris.readthedocs.io/en/stable/
BSD 3-Clause "New" or "Revised" License
635 stars 283 forks source link

Upstream changes in netcdftime #1654

Closed r-shekhar closed 9 years ago

r-shekhar commented 9 years ago

It looks like there have been upstream changes in netcdftime. This causes failures when trying to load a grib file in site-packages/iris/unit.py

The latest version:

In [5]: print(dir(netcdftime))
['DateFromJulianDay', 'JulianDayFromDate', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '_datetime', '_parse_date', 'date2index', 'datetime', 'netcdftime', 'time2index', 'utime']

An older version:

>>> print(dir(netcdftime))
['DateFromJulianDay', 'ISO8601_REGEX', 'JulianDayFromDate', 'TIMEZONE_REGEX', '_360DayFromDate', '_AllLeapFromDate', '_DateFrom360Day', '_DateFromAllLeap', '_DateFromNoLeapDay', '_NoLeapDayFromDate', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_calendars', '_check_index', '_dateparse', '_findall', '_illegal_s', '_parse_date', '_parse_timezone', '_strftime', '_toscalar', '_units', 'date2index', 'date2num', 'datetime', 'math', 'monthrange', 'num2date', 'numpy', 'operator', 're', 'real_datetime', 'time', 'time2index', 'timedelta', 'tzinfo', 'utime']

Here's a link to the changed file: Raw Latest netcdftime

Here's a full traceback:

AttributeError                            Traceback (most recent call last)
<ipython-input-2-fdf84a32544b> in <module>()
----> 1 k = iris.load('ei.oper.an.pl.regn128sc.2012080112')

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/__init__.pyc in load(uris, constraints, callback)
    301
    302     """
--> 303     return _load_collection(uris, constraints, callback).merged().cubes()
    304
    305

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/__init__.pyc in _load_collection(uris, constraints, callback)
    271     try:
    272         cubes = _generate_cubes(uris, callback, constraints)
--> 273         result = iris.cube._CubeFilterCollection.from_cubes(cubes, constraints)
    274     except EOFError as e:
    275         raise iris.exceptions.TranslationError(

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/cube.pyc in from_cubes(cubes, constraints)
    137         pairs = [_CubeFilter(constraint) for constraint in constraints]
    138         collection = _CubeFilterCollection(pairs)
--> 139         for cube in cubes:
    140             collection.add_cube(cube)
    141         return collection

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/__init__.pyc in _generate_cubes(uris, callback, constraints)
    258         if scheme == 'file':
    259             part_names = [x[1] for x in groups]
--> 260             for cube in iris.io.load_files(part_names, callback, constraints):
    261                 yield cube
    262         elif scheme in ['http', 'https']:

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/io/__init__.pyc in load_files(filenames, callback, constraints)
    197                 yield cube
    198         else:
--> 199             for cube in handling_format_spec.handler(fnames, callback):
    200                 yield cube
    201

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/fileformats/rules.pyc in load_cubes(filenames, user_callback, loader, filter_function)
    797                 continue
    798             # Convert the field to a Cube.
--> 799             cube, factories, references = _make_cube(field, loader.converter)
    800
    801             # Run any custom user-provided rules.

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/fileformats/rules.pyc in _make_cube(field, converter)
    750 def _make_cube(field, converter):
    751     # Convert the field to a Cube.
--> 752     metadata = converter(field)
    753
    754     try:

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/fileformats/grib/load_rules.pyc in convert(grib)
    168             (grib._phenomenonDateTime != -1.0):
    169         aux_coords_and_dims.append((DimCoord(points=grib.startStep, standard_name='forecast_period', units=grib._forecastTimeUnit), None))
--> 170         aux_coords_and_dims.append((DimCoord(points=grib.phenomenon_points('hours'), standard_name='time', units=Unit('hours since epoch', CALENDAR_GREGORIAN)), None))
    171
    172     def add_bounded_time_coords(aux_coords_and_dims, grib):

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/fileformats/grib/__init__.pyc in phenomenon_points(self, time_unit)
    707         time_reference = '%s since epoch' % time_unit
    708         return iris.unit.date2num(self._phenomenonDateTime, time_reference,
--> 709                                   iris.unit.CALENDAR_GREGORIAN)
    710
    711     def phenomenon_bounds(self, time_unit):

/home/geo/boos/rs784/dists/10.0/lib/python2.7/site-packages/iris/unit.pyc in date2num(date, unit, calendar)
    635     if unit_string.endswith(" since epoch"):
    636         unit_string = unit_string.replace("epoch", IRIS_EPOCH)
--> 637     return netcdftime.date2num(date, unit_string, calendar)
    638
    639
rhattersley commented 9 years ago

Fixed by #1655.

Thanks for reporting this @afterspark :smile: