質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3466閲覧

netCDFのファイルに対してgetメソッドを使用し、値が無い場合にnoneを返したい(python)

Daimian

総合スコア53

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/10 04:27

編集2019/02/10 09:47

前提・実現したいこと

下記のソースコードを実行し、csvに出力&mapを描画という結果を得ようとしています。

発生している問題・エラーメッセージ

ファイルを実行した際に、下記のように'lightning_flash_lat'が無いと言われてしまいます。しかし、'lightning_flash_lat'が無い場合でも、何も無い値で(空欄で)csvを出力したい場合、どのようにコードを書き換えれば良いでしょうか?

File "kaminaridama_min_variables.py", line 70, in <module> flash_lat = np.concatenate([flash_lat,datafile.variables['lightning_flash_lat'][:]]) KeyError: 'lightning_flash_lat'

該当のソースコード

python

1# -*- coding: utf-8 -*- 2 3#### Import Python packages #### 4import numpy as np 5import glob 6from netCDF4 import Dataset 7import matplotlib.pyplot as plt 8from mpl_toolkits.basemap import Basemap 9import csv 10try: 11 # Python 2 12 from itertools import izip 13except ImportError: 14 # Python 3 15 izip = zip 16import datetime 17 18default_time = datetime.datetime(1993, 1, 1, 00, 00, 00) 19 20dataDir = '/Users/hoge/2019/0208/' 21csvfile = "/Users/hoge/isslis_flashloc_test.csv" 22 23#Identify all NetCDF files in the directory 24files = glob.glob(dataDir+'*.nc') 25 26flash_lat = np.array([]) 27flash_lon = np.array([]) 28 29for i in files: 30 datafile = Dataset(i) 31 32 flash_lat = np.concatenate([flash_lat,datafile.variables['lightning_flash_lat'][:]]) 33 flash_lon = np.concatenate([flash_lon,datafile.variables['lightning_flash_lon'][:]]) 34 35with open(csvfile, 'w') as myfile: 36 writer = csv.writer(myfile) 37 writer.writerows(izip(["flash_lat"], ["flash_lon"])) 38 39 writer.writerows(izip(flash_lat, flash_lon)) 40 41#Create plot of lightning flash location heat map 42plt.figure(figsize=((20,20))) #Set plot dimensions 43map = Basemap(projection='cyl', lon_0 = 0, resolution='c') 44lightning = map.hexbin(flash_lon, flash_lat, gridsize=300,bins='log',cmap='jet',mincnt=1,zorder=10) #Bin flash counts into hexbins using a gridsize of your choice 45 46#Draw geographic boundaries and meridians/parallels 47map.drawmapboundary(fill_color='k') 48map.fillcontinents(color='grey',lake_color='grey') 49map.drawcoastlines(color='white') 50map.drawcountries(color='white') 51map.drawmeridians(np.arange(0,390,30), labels=[0,0,0,1],fontsize=10, color="lightgray") 52map.drawparallels(np.arange(-90,120,30), labels=[1,0,0,0],fontsize=10, color="lightgray") 53 54cbar = map.colorbar(lightning,location='bottom',pad="5%") 55cbar.set_label('Flash Count') #Remember to change label 56 57plt.title('ISS LIS Detected Lightning Flash Locations January 4, 2018', fontsize = 18) #Rember to change title 58 59 60plt.show() 61

試したこと

下記を試しましたが、そもそもdatafileがnetCDFであるため、下記を実施してみても「AttributeError: NetCDF: Attribute not found」とエラーが返ってきてしまいます。

datafile.get('lightning_flash_lat', 'none')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まずはドキュメントをよく読んで、試してみてはいかがでしょうか。
エラーになったとしても怪我をするわけでもないですし。

http://unidata.github.io/netcdf4-python/

以下のような感じでどのような要素があるか確認できるのではないでしょうか。
確認した上で、データがあるか否かはsizeでチェックできるのではないかと。

python

1for dimobj in datafile.dimensions.values(): 2 print dimobj

投稿2019/02/12 05:58

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

そのライブラリに関する知識はまったくありませんが、datafile.getではなくdatafile.variables.getで叩くべきなのでは。

KeyErrorをraiseしてくるならdatafile.variablesそのものは辞書likeなオブジェクトであると期待できる気がします。

どうしても駄目なら、

python

1def f(d, k, default="none"): 2 try: 3 return d[k] 4 except KeyError: 5 return default

みたいなのを書いて使う手はあります。

投稿2019/02/10 13:18

編集2019/02/10 13:21
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問