|  | 
| 120 | 120 |    "source": [ | 
| 121 | 121 |     "# Use pandas to create an array of datetimes\n", | 
| 122 | 122 |     "import pandas as pd\n", | 
|  | 123 | +    "\n", | 
| 123 | 124 |     "times = pd.date_range('2018-01-01', periods=5)\n", | 
| 124 | 125 |     "times" | 
| 125 | 126 |    ] | 
|  | 
| 219 | 220 |    "outputs": [], | 
| 220 | 221 |    "source": [ | 
| 221 | 222 |     "from datetime import timedelta\n", | 
|  | 223 | +    "\n", | 
| 222 | 224 |     "temp.sel(time='2018-01-07', method='nearest', tolerance=timedelta(days=2))" | 
| 223 | 225 |    ] | 
| 224 | 226 |   }, | 
|  | 
| 251 | 253 |    "metadata": {}, | 
| 252 | 254 |    "outputs": [], | 
| 253 | 255 |    "source": [ | 
| 254 |  | -    "temp.sel(time=slice('2018-01-01', '2018-01-03'), lon=slice(-110, -70), lat=slice(25, 45))" | 
|  | 256 | +    "temp.sel(\n", | 
|  | 257 | +    "    time=slice('2018-01-01', '2018-01-03'), lon=slice(-110, -70), lat=slice(25, 45)\n", | 
|  | 258 | +    ")" | 
| 255 | 259 |    ] | 
| 256 | 260 |   }, | 
| 257 | 261 |   { | 
|  | 
| 289 | 293 |    "outputs": [], | 
| 290 | 294 |    "source": [ | 
| 291 | 295 |     "# This *doesn't* work however:\n", | 
| 292 |  | -    "#temp.loc[-110:-70, 25:45,'2018-01-01':'2018-01-03']" | 
|  | 296 | +    "# temp.loc[-110:-70, 25:45,'2018-01-01':'2018-01-03']" | 
| 293 | 297 |    ] | 
| 294 | 298 |   }, | 
| 295 | 299 |   { | 
|  | 
| 494 | 498 |    "outputs": [], | 
| 495 | 499 |    "source": [ | 
| 496 | 500 |     "from cftime import date2num\n", | 
|  | 501 | +    "\n", | 
| 497 | 502 |     "time_units = 'hours since {:%Y-%m-%d 00:00}'.format(times[0])\n", | 
| 498 | 503 |     "time_vals = date2num(times, time_units)\n", | 
| 499 | 504 |     "time_vals" | 
|  | 
| 519 | 524 |    "metadata": {}, | 
| 520 | 525 |    "outputs": [], | 
| 521 | 526 |    "source": [ | 
| 522 |  | -    "ds = xr.Dataset({'temperature': (['time', 'z', 'y', 'x'], temps, {'units':'Kelvin'})},\n", | 
| 523 |  | -    "                 coords={'x_dist': (['x'], x, {'units':'km'}),\n", | 
| 524 |  | -    "                         'y_dist': (['y'], y, {'units':'km'}),\n", | 
| 525 |  | -    "                         'pressure': (['z'], press, {'units':'hPa'}),\n", | 
| 526 |  | -    "                         'forecast_time': (['time'], times)\n", | 
| 527 |  | -    "                })\n", | 
|  | 527 | +    "ds = xr.Dataset(\n", | 
|  | 528 | +    "    {'temperature': (['time', 'z', 'y', 'x'], temps, {'units': 'Kelvin'})},\n", | 
|  | 529 | +    "    coords={\n", | 
|  | 530 | +    "        'x_dist': (['x'], x, {'units': 'km'}),\n", | 
|  | 531 | +    "        'y_dist': (['y'], y, {'units': 'km'}),\n", | 
|  | 532 | +    "        'pressure': (['z'], press, {'units': 'hPa'}),\n", | 
|  | 533 | +    "        'forecast_time': (['time'], times),\n", | 
|  | 534 | +    "    },\n", | 
|  | 535 | +    ")\n", | 
| 528 | 536 |     "ds" | 
| 529 | 537 |    ] | 
| 530 | 538 |   }, | 
|  | 
| 635 | 643 |    "metadata": {}, | 
| 636 | 644 |    "outputs": [], | 
| 637 | 645 |    "source": [ | 
| 638 |  | -    "ds.x.attrs['axis'] = 'X' # Optional\n", | 
|  | 646 | +    "ds.x.attrs['axis'] = 'X'  # Optional\n", | 
| 639 | 647 |     "ds.x.attrs['standard_name'] = 'projection_x_coordinate'\n", | 
| 640 | 648 |     "ds.x.attrs['long_name'] = 'x-coordinate in projected coordinate system'\n", | 
| 641 | 649 |     "\n", | 
| 642 |  | -    "ds.y.attrs['axis'] = 'Y' # Optional\n", | 
|  | 650 | +    "ds.y.attrs['axis'] = 'Y'  # Optional\n", | 
| 643 | 651 |     "ds.y.attrs['standard_name'] = 'projection_y_coordinate'\n", | 
| 644 | 652 |     "ds.y.attrs['long_name'] = 'y-coordinate in projected coordinate system'" | 
| 645 | 653 |    ] | 
|  | 
| 696 | 704 |    "outputs": [], | 
| 697 | 705 |    "source": [ | 
| 698 | 706 |     "from pyproj import Proj\n", | 
|  | 707 | +    "\n", | 
| 699 | 708 |     "X, Y = np.meshgrid(x, y)\n", | 
| 700 |  | -    "lcc = Proj({'proj':'lcc', 'lon_0':-105, 'lat_0':40, 'a':6371000.,\n", | 
| 701 |  | -    "            'lat_1':25})\n", | 
|  | 709 | +    "lcc = Proj({'proj': 'lcc', 'lon_0': -105, 'lat_0': 40, 'a': 6371000.0, 'lat_1': 25})\n", | 
| 702 | 710 |     "lon, lat = lcc(X * 1000, Y * 1000, inverse=True)" | 
| 703 | 711 |    ] | 
| 704 | 712 |   }, | 
|  | 
| 715 | 723 |    "metadata": {}, | 
| 716 | 724 |    "outputs": [], | 
| 717 | 725 |    "source": [ | 
| 718 |  | -    "ds = ds.assign_coords(lon = (['y', 'x'], lon))\n", | 
| 719 |  | -    "ds = ds.assign_coords(lat = (['y', 'x'], lat))\n", | 
|  | 726 | +    "ds = ds.assign_coords(lon=(['y', 'x'], lon))\n", | 
|  | 727 | +    "ds = ds.assign_coords(lat=(['y', 'x'], lat))\n", | 
| 720 | 728 |     "ds" | 
| 721 | 729 |    ] | 
| 722 | 730 |   }, | 
|  | 
| 775 | 783 |    "source": [ | 
| 776 | 784 |     "ds['lambert_projection'] = int()\n", | 
| 777 | 785 |     "ds.lambert_projection.attrs['grid_mapping_name'] = 'lambert_conformal_conic'\n", | 
| 778 |  | -    "ds.lambert_projection.attrs['standard_parallel'] = 25.\n", | 
| 779 |  | -    "ds.lambert_projection.attrs['latitude_of_projection_origin'] = 40.\n", | 
| 780 |  | -    "ds.lambert_projection.attrs['longitude_of_central_meridian'] = -105.\n", | 
|  | 786 | +    "ds.lambert_projection.attrs['standard_parallel'] = 25.0\n", | 
|  | 787 | +    "ds.lambert_projection.attrs['latitude_of_projection_origin'] = 40.0\n", | 
|  | 788 | +    "ds.lambert_projection.attrs['longitude_of_central_meridian'] = -105.0\n", | 
| 781 | 789 |     "ds.lambert_projection.attrs['semi_major_axis'] = 6371000.0\n", | 
| 782 | 790 |     "ds.lambert_projection" | 
| 783 | 791 |    ] | 
|  | 
0 commit comments