Я пытаюсь решить проблему, когда у меня есть данные XML, которые имеют 2 временных ряда (иногда больше) измерений в одном файле. В этом случае измерения температуры и скорости ветра происходят с одного и того же интервала времени. Смотрите файл XML ниже:Анализ XML-файлов с помощью Python
<?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">
для скорости ветра (Нан в этом файле).
Я хотел бы перебирать эти серии по отдельности и сохранять их в формате .txt в табличном формате. Я могу сохранить данные временных рядов, но я не могу их разделить на несколько столбцов, например. to time | temp | формат скорости ветра.
Мой текущий код работает, если файл 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))
Поскольку измерения для температуры и WS имеют одинаковую длину, как я мог бы итерацию через них (другой тег может быть?) И возвращать кортеж для каждой временной точки, например. (time,temp value, winds speed value)
EDIT: Результаты этой печати. Но если я добавлю тег, как это 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
Я не уверен, я понимаю эту проблему, но это звучит, как все, что вам нужно сделать, это заархивировать данные времени и-ТЕМП с Time- и-windspeed, которые вы используете с 'zip', который вы уже используете, поэтому, вероятно, вы знаете, как использовать его снова. – abarnert
Или вы спрашиваете, как написать вложенный поиск (или единственный запрос XPath), чтобы получить «время» и «значение» из каждой конкретной серии, вместо того, чтобы получать какие-либо теги 'time' и' value' в любом месте файла? – abarnert
Да, у меня проблемы с разделом двух серий, в которых они используют один и тот же тег. Мой текущий код просто проходит через файл и сохраняет последние данные скорости ветра ниже температурных данных. Я хотел бы использовать (возможно, запрос XPath?), Который я мог бы использовать для «стека» столбца данных вместе с кортежами (time_i, temp_i, windspeed_i) для i = length (series). – ELEC