我正在尝试解决一个问题,即我的 XML 数据在同一文件中具有 2 个时间序列(有时更多)的测量值。在这种情况下,温度和风速测量来自同一时间间隔。请参阅下面的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection
timeStamp="2015-04-16T09:40:29Z"
numberMatched="2"
numberReturned="2"
xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:om="http://www.opengis.net/om/2.0"
xmlns:ompr="http://inspire.ec.europa.eu/schemas/ompr/2.0rc3"
xmlns:omso="http://inspire.ec.europa.eu/schemas/omso/2.0rc3"
xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmd="http://www.isotc211.org/2005/gmd"
xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:swe="http://www.opengis.net/swe/2.0"
xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0"
xmlns:sam="http://www.opengis.net/sampling/2.0"
xmlns:sams="http://www.opengis.net/samplingSpatial/2.0"
xmlns:wml2="http://www.opengis.net/waterml/2.0"
xmlns:target="http://xml.fmi.fi/namespace/om/atmosphericfeatures/0.95"
xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd
http://www.opengis.net/gmlcov/1.0 http://schemas.opengis.net/gmlcov/1.0/gmlcovAll.xsd
http://www.opengis.net/sampling/2.0 http://schemas.opengis.net/sampling/2.0/samplingFeature.xsd
http://www.opengis.net/samplingSpatial/2.0 http://schemas.opengis.net/samplingSpatial/2.0/spatialSamplingFeature.xsd
http://www.opengis.net/swe/2.0 http://schemas.opengis.net/sweCommon/2.0/swe.xsd
http://inspire.ec.europa.eu/schemas/ompr/2.0rc3 http://inspire.ec.europa.eu/draft-schemas/ompr/2.0rc3/Processes.xsd
http://inspire.ec.europa.eu/schemas/omso/2.0rc3 http://inspire.ec.europa.eu/draft-schemas/omso/2.0rc3/SpecialisedObservations.xsd
http://www.opengis.net/waterml/2.0 http://inspire.ec.europa.eu/draft-schemas/waterml/2.0rfc/waterml2.xsd
http://xml.fmi.fi/namespace/om/atmosphericfeatures/0.95 http://xml.fmi.fi/schema/om/atmosphericfeatures/0.95/atmosphericfeatures.xsd">
<wfs:member>
<omso:PointTimeSeriesObservation gml:id="WFS-fip7WVVLMFTJudLNbf8qa6jEiVKJTowqYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08oWliy59O6pp25bX_0KFCMbHy51qRaFOO6dNGTVwzsu7JU07ctr_6FCiGdm26eenJzrMYsGLBg3Zmzfjw7MtambTfjSV3XpmcNbbh8RNPPph3Y8tK1dCA0tuHxF4b8ejnODHM3tuXpl30MPLDty9MvLnWt0y7eGXlh6deWVrbdPPnp3Z6mXx0rGnYZza3dds_NT6Yemnfu5zhNbj1w7NPTzJ3Zt9Y2_Nma3Pph6ad.6p54Za0N_DLuyYemFuc.m_llyceuXl5v6claYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08mh007ctPpl4T8hNDpp25bW_dlrGq1IYA-">
<om:phenomenonTime>
<gml:TimePeriod gml:id="time1-1-1">
<gml:beginPosition>2015-01-01T00:00:00Z</gml:beginPosition>
<gml:endPosition>2015-01-02T00:00:00Z</gml:endPosition>
</gml:TimePeriod>
</om:phenomenonTime>
<om:resultTime>
<gml:TimeInstant gml:id="time2-1-1">
<gml:timePosition>2015-01-02T00:00:00Z</gml:timePosition>
</gml:TimeInstant>
</om:resultTime>
<om:procedure xlink:href="http://xml.fmi.fi/inspire/process/opendata"/>
<om:parameter>
<om:NamedValue>
<om:name xlink:href="http://inspire.ec.europa.eu/codeList/ProcessParameterValue/value/groundObservation/observationIntent"/>
<om:value>
atmosphere
</om:value>
</om:NamedValue>
</om:parameter>
<om:observedProperty xlink:href="http://data.fmi.fi/fmi-apikey/41156987-d187-45e2-a2d3-6113c39b15ab/meta?observableProperty=observation&param=temperature&language=eng"/>
<om:featureOfInterest>
<sams:SF_SpatialSamplingFeature gml:id="fi-1-1-temperature">
<sam:sampledFeature>
<target:LocationCollection gml:id="sampled-target-1-1-temperature">
<target:member>
<target:Location gml:id="obsloc-fmisid-101007-pos-temperature">
<gml:identifier codeSpace="http://xml.fmi.fi/namespace/stationcode/fmisid">101007</gml:identifier>
<gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/name">Helsinki Rautatientori</gml:name>
<gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/geoid">-16011680</gml:name>
<gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/wmo">2934</gml:name>
<target:representativePoint xlink:href="#point-101007"/>
<target:region codeSpace="http://xml.fmi.fi/namespace/location/region">Helsinki</target:region>
</target:Location></target:member>
</target:LocationCollection>
</sam:sampledFeature>
<sams:shape>
<gml:Point gml:id="point-1-1-temperature" srsName="http://www.opengis.net/def/crs/EPSG/0/4258" srsDimension="2">
<gml:name>Helsinki Rautatientori</gml:name>
<gml:pos>60.17169 24.94460 </gml:pos>
</gml:Point>
</sams:shape>
</sams:SF_SpatialSamplingFeature>
</om:featureOfInterest>
<om:result>
<wml2:MeasurementTimeseries gml:id="obs-obs-1-1-temperature">
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T00:00:00Z</wml2:time>
<wml2:value>4.6</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T01:00:00Z</wml2:time>
<wml2:value>4.5</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T02:00:00Z</wml2:time>
<wml2:value>4.2</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T03:00:00Z</wml2:time>
<wml2:value>4.0</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T04:00:00Z</wml2:time>
<wml2:value>4.1</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T05:00:00Z</wml2:time>
<wml2:value>4.1</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T06:00:00Z</wml2:time>
<wml2:value>4.5</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T07:00:00Z</wml2:time>
<wml2:value>4.1</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T08:00:00Z</wml2:time>
<wml2:value>3.3</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T09:00:00Z</wml2:time>
<wml2:value>2.9</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T10:00:00Z</wml2:time>
<wml2:value>2.5</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T11:00:00Z</wml2:time>
<wml2:value>2.4</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T12:00:00Z</wml2:time>
<wml2:value>2.5</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T13:00:00Z</wml2:time>
<wml2:value>2.7</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T14:00:00Z</wml2:time>
<wml2:value>2.8</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T15:00:00Z</wml2:time>
<wml2:value>3.1</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T16:00:00Z</wml2:time>
<wml2:value>3.3</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T17:00:00Z</wml2:time>
<wml2:value>3.7</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T18:00:00Z</wml2:time>
<wml2:value>4.1</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T19:00:00Z</wml2:time>
<wml2:value>4.1</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T20:00:00Z</wml2:time>
<wml2:value>4.4</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T21:00:00Z</wml2:time>
<wml2:value>4.7</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T22:00:00Z</wml2:time>
<wml2:value>4.6</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T23:00:00Z</wml2:time>
<wml2:value>4.7</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-02T00:00:00Z</wml2:time>
<wml2:value>4.2</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
</wml2:MeasurementTimeseries>
</om:result>
</omso:PointTimeSeriesObservation>
</wfs:member>
<wfs:member>
<omso:PointTimeSeriesObservation gml:id="WFS-6fPzOlwmFuqLQd1YDR_0qMRemw2JTowqYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08oWliy59O6pp25bX_0KFCMbHy51qRaFOO6dNGTVwzsu7JU07ctr_6FCiGdm26eenJzrMYsGLBg3Zmzfjw7MtambTfjSV3XpmcNbbh8RNPPph3Y8tK1dCA0tuHxF4b8ejnODHM3tuXpl30MPLDty9MvLnWt307snPhly5NvNrbdPPnp3Z6mXx0rGnYZza3dds_NT6Yemnfu5zhNbj1w7NPTzJ3Zt9Y2_Nma3Pph6ad.6p54Za0N_DLuyYemFuc.m_llyceuXl5v6claYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08mh007ctPpl4T8hNDpp25bW_dlrGq1IYA-">
<om:phenomenonTime xlink:href="#time1-1-1"/>
<om:resultTime xlink:href="#time2-1-1"/>
<om:procedure xlink:href="http://xml.fmi.fi/inspire/process/opendata"/>
<om:parameter>
<om:NamedValue>
<om:name xlink:href="http://inspire.ec.europa.eu/codeList/ProcessParameterValue/value/groundObservation/observationIntent"/>
<om:value>
atmosphere
</om:value>
</om:NamedValue>
</om:parameter>
<om:observedProperty xlink:href="http://data.fmi.fi/fmi-apikey/41156987-d187-45e2-a2d3-6113c39b15ab/meta?observableProperty=observation&param=windspeedms&language=eng"/>
<om:featureOfInterest>
<sams:SF_SpatialSamplingFeature gml:id="fi-1-1-windspeedms">
<sam:sampledFeature>
<target:LocationCollection gml:id="sampled-target-1-1-windspeedms">
<target:member>
<target:Location gml:id="obsloc-fmisid-101007-pos-windspeedms">
<gml:identifier codeSpace="http://xml.fmi.fi/namespace/stationcode/fmisid">101007</gml:identifier>
<gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/name">Helsinki Rautatientori</gml:name>
<gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/geoid">-16011680</gml:name>
<gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/wmo">2934</gml:name>
<target:representativePoint xlink:href="#point-101007"/>
<target:region codeSpace="http://xml.fmi.fi/namespace/location/region">Helsinki</target:region>
</target:Location></target:member>
</target:LocationCollection>
</sam:sampledFeature>
<sams:shape>
<gml:Point gml:id="point-1-1-windspeedms" srsName="http://www.opengis.net/def/crs/EPSG/0/4258" srsDimension="2">
<gml:name>Helsinki Rautatientori</gml:name>
<gml:pos>60.17169 24.94460 </gml:pos>
</gml:Point>
</sams:shape>
</sams:SF_SpatialSamplingFeature>
</om:featureOfInterest>
<om:result>
<wml2:MeasurementTimeseries gml:id="obs-obs-1-1-windspeedms">
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T00:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T01:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T02:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T03:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T04:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T05:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T06:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T07:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T08:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T09:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T10:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T11:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T12:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T13:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T14:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T15:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T16:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T17:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T18:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T19:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T20:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T21:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T22:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-01T23:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
<wml2:point>
<wml2:MeasurementTVP>
<wml2:time>2015-01-02T00:00:00Z</wml2:time>
<wml2:value>NaN</wml2:value>
</wml2:MeasurementTVP>
</wml2:point>
</wml2:MeasurementTimeseries>
</om:result>
</omso:PointTimeSeriesObservation>
</wfs:member>
</wfs:FeatureCollection>
数据嵌套在 <wml2:MeasurementTimeseries gml:id="obs-obs-1-1-temperature"> for the temperature and within
内<wml2:MeasurementTimeseries gml:id="obs-obs-1-1-windspeedms">
风速(本文件中为 NaN)。
我想分别迭代这些系列并将它们以表格格式保存到 .txt 文件中。我能够保存时间序列数据,但我无法按列将它们分开,例如。时间|温度|风速格式。
如果 XML 文件只有一个测量值(单独的温度或风速),我当前的代码就可以工作,因为我只需要迭代该文件。
import xml.etree.cElementTree as ET
tree = ET.ElementTree(file='XML_file.xml')
def parser(item1,item2):
return item1.text,item2.text
data = [parser(item1,item2) for item1,item2 in zip(tree.iter(tag='{http://www.opengis.net/waterml/2.0}time'),tree.iter(tag='{http://www.opengis.net/waterml/2.0}value'))]
with open('data.txt', 'w') as fp:
fp.write('\n'.join('%s|%s' % x for x in data))
因为 temp 和 ws 的测量长度相同,我如何迭代它们(也许不同的标签?)并返回每个时间点的元组,例如。 (time,temp value, winds speed value)
编辑:这会打印结果。但是如果我添加这样的标签 i.iter(tag='{http://www.opengis.net/waterml/2.0}MeasurementTimeseries')
我得到TypeError: iter() takes no keyword arguments
。
for i in tree.iter(tag='{http://www.opengis.net/waterml/2.0}MeasurementTimeseries'):
for j in i.iter():
print j.text
打印:
2015-01-01T00:00:00Z
4.6
2015-01-01T01:00:00Z
4.5
最佳答案
我认为您要求的是这样的:您只想查找温度标签下的时间和值标签,而不是查找文件中任何位置的所有时间和值标签。 (然后仅对 Windspeed 标签下的时间和值标签执行相同的操作,然后将两者压缩在一起,但如果您有第一部分,您可以自己完成该部分。)
为此,您需要嵌套搜索。
您可以通过两次搜索显式地执行此操作,例如,迭代两个 MeasurementTimeseries
,然后在每个搜索中迭代其时间
和 值
后代:
def parse_one_series(series):
return [parser(item1,item2) for item1,item2 in
zip(series.iter(tag='{http://www.opengis.net/waterml/2.0}time'),
series.iter(tag='{http://www.opengis.net/waterml/2.0}value'))]
data = zip(*(parse_one_series(series) for series in
tree.iter(tag='{http://www.opengis.net/waterml/2.0}MeasurementTimeseries')))
现在,data 中的每个元素都是一对,第一个是时间和温度,第二个是时间和风速。尽管您可能希望将事情组织得更好一些:
data = [(time, temp, wind) for (time, temp), (_, wind) in data]
关于python - 使用 Python 解析 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671395/