cedadev/cf-checker

`datetime64` considered non numeric

Opened this issue · 2 comments

The following dataset:

Dataset:
- Dimensions: bounds(2), time(n), ...
- Coordinates:
  - time (time) datetime64[ns] 2004-01-16
  - ...
 - Data variables:
  - time_bnds (time, bounds2) datetime64[ns] ...
  - ...
- Attributes:
  - Conventions : CF-1.8
  - ...

raises the following error:

ERROR: (7.1): boundary variable with non-numeric data type

See the following code:
https://github.com/cedadev/cf-checker/blob/master/src/cfchecker/cfchecks.py#L1159
checks for:

not self.isNumeric(bounds)

it looks "datetime64" is considered "nonNumeric".

How to reproduce (a bit long):

import cf
import numpy as np

# field: specific_humidity
f = cf.Field()
f.set_properties({'standard_name': 'specific_humidity', 'units': '1'})
d = cf.Data([0.007, 0.034])
f.nc_set_variable('q')

# domain_axis: ncdim%time
c = cf.DomainAxis()
c.set_size(2)
c.nc_set_dimension('time')
f.set_construct(c, key='domainaxis0', copy=False)

# field data axes
f.set_data_axes(('domainaxis0'))

# dimension_coordinate: time
c = cf.DimensionCoordinate()
c.set_properties({'units': 'days since 2004-01-01', 'standard_name': 'time'})
d = cf.Data(cf.dt_vector(['2004-01-15', '2004-02-15']))
c.set_data(d)
c.nc_set_variable('time')
b = cf.Bounds()
b.set_properties({})
d = cf.Data([cf.dt_vector(['2004-01-01', '2004-01-31']), 
             cf.dt_vector(['2004-02-01', '2004-02-28'])])
b.set_data(d)
b.nc_set_variable('time_bnds')
c.set_bounds(b)
f.set_construct(c, axes=('domainaxis0',), key='dimensioncoordinate0', copy=False)

# Create file
cf.write(f, filename, Conventions='CF-1.8') #Bug, it creates CF-1.9

# Dirtycode: cfchecks does not support CF-1.9
import netCDF4 as nc4
ncfid = nc4.Dataset(filename, mode='a', format='NETCDF4')
ncfid.Conventions = "CF-1.8"
ncfid.close()

and then run

cfchecks test.nc
CHECKING NetCDF FILE: test.nc
=====================
Using CF Checker Version 4.1.0
Checking against CF Version CF-1.8
Using Standard Name Table Version 78 (2021-09-21T11:55:06Z)
Using Area Type Table Version 10 (23 June 2020)
Using Standardized Region Name Table Version 4 (18 December 2018)

ERROR: (7.1): boundary variable with non-numeric data type

------------------
Checking variable: time_bnds
------------------

------------------
Checking variable: time
------------------
WARN: (4.4.1): Use of the calendar and/or month_lengths attributes is recommended for time coordinate variables

------------------
Checking variable: q
------------------

ERRORS detected: 1
WARNINGS given: 1
INFORMATION messages: 0

It also applies to int64 see: xarray-contrib/cf-xarray#310

I am seeing the same problem.

ERROR: (7.1): boundary variable with non-numeric data type

My file contains three boundary variables:

	int64 time_bnds(time, bnds) ;
	double projection_y_coordinate_bnds(projection_y_coordinate, bnds) ;
	double projection_x_coordinate_bnds(projection_x_coordinate, bnds) ;

Based on the previous comment I assume it must be the time bounds that it is complaining about.