2016-12-29 5 views
0

XMLファイルから2つの異なる要素を取得しようとしていますが、これを散布図のxとyとして印刷しようとしています。私がそれらをプロットするとき、それは他の要素をプロットするために日付のうちの1つを使用するだけです。私は気象HTMLを取得し、それをXMLとして保存するために以下のコードを使用しています。pythonのリストからdatetime.datetimeを削除します

 url = "http://api.met.no/weatherapi/locationforecast/1.9/?lat=52.41616;lon=-4.064598" 
     response = requests.get(url) 
     xml_text=response.text 
     weather= bs4.BeautifulSoup(xml_text, "xml") 
     f = open('file.xml', "w") 
     f.write(weather.prettify()) 
     f.close() 

次に、時間( 'from')要素と( 'windSpeed'> 'mps')要素と属性を取得しようとしています。私は散布図にxとyとしてプロットしようとしています。

with open ('file.xml') as file: 
    soup = bs4.BeautifulSoup(file, "xml") 
    times = soup.find_all("time") 
    windspeed = soup.select("windSpeed") 
    form = ("%Y-%m-%dT%H:%M:%SZ") 
    x = [] 
    y = [] 
    for element in times: 
     time = element.get("from") 
     t = datetime.datetime.strptime(time, form) 
     x.append(t) 
    for mps in windspeed: 
     speed = mps.get("mps") 
     y.append(speed) 
    plt.scatter(x, y)   
    plt.show() 

は、私は2つのループから2つのリストを作成しようとしている、その後、xとyとして、それらを読んで、私はそれを実行したときには、エラーが発生します。 xとyは同じサイズ

でなければならない、私はそれがdatetime.datetimeの(2016、12、22としてリストを出力しますので、それはだと仮定しています: はとValueError(「xとyは同じサイズでなければなりません」) ValueErrorを送出し、21、0)、リストからdatetime.datetimeを削除するにはどうすればいいですか?

私はおそらくそれを修正する簡単な方法があることを知っています。どんなアイデアも素晴らしいでしょう。ここのスタックにいる人々は、コード学習のお手伝いをしています。おかげ

答えて

0

は単に私はそれがあなた与えるので、あなたがXMLを解析するためのlxmlのを使用することを示唆しているy軸の値を持つ2つのリストのx軸の値を含む1やその他を作り、機能に

plt.scatter(list1, list2);

+0

私は2つのリストを使用しようとしましたが、それは私が質問に入れたエラーをスローしています。 –

+0

'plt.scatter(x、y)とplt.show()'をforループに入れないでください。 –

+0

@ M.Man 'x.append(t)'の 't'は何ですか?それはまたあなたにエラーを引き起こす可能性があります –

0

を散乱させるために渡します人生をはるかに簡単にすることができるxpath式を使用する能力。この場合、毎回のエントリにwindSpeedエントリが含まれているわけではありません。したがって、関連する時刻を取得するには、最初にwindSpeedエントリを特定することが不可欠です。このコードはそれを行います。私が通常遭遇する2つの小さな問題があります:(1)私はそれを正しくするためにxpathで "遊ぶ"必要があります。 (2)シングルトンが期待されるときにリストを取得することがありますが、これはコードに '[0]'が含まれる理由です。私は対話的にコードを構築するほうが良いことがわかります。

>>> from lxml import etree 
>>> XML = open('file.xml') 
>>> tree = etree.parse(XML) 
>>> for count, windSpeeds in enumerate(tree.xpath('//windSpeed')): 
...  windSpeeds.attrib['mps'], windSpeeds.xpath('../..')[0].attrib['from'] 
...  if count>5: 
...   break 
...  
('3.9', '2016-12-29T18:00:00Z') 
('4.8', '2016-12-29T21:00:00Z') 
('5.0', '2016-12-30T00:00:00Z') 
('4.5', '2016-12-30T03:00:00Z') 
('4.1', '2016-12-30T06:00:00Z') 
('3.8', '2016-12-30T09:00:00Z') 
('4.4', '2016-12-30T12:00:00Z') 
関連する問題