簡體   English   中英

如何快速比較Python中解析的XML的日期?

[英]How do I quickly compare dates from parsed XML in Python?

我正在使用Python 3中的一個函數,該函數從eBird API查詢小塊XML,並使用minidom解析它們。 該函數定位並比較兩個請求的XML塊的日期,返回最新的。 下面的代碼完成了它的工作,但是我想問一下是否有一種更簡單的方法(for循環似乎沒有必要,因為XML的每一位都只有一個日期,並且逐位比較返回的字符串片段似乎笨重)。 有沒有更快的方法來產生相同的結果?

from xml.dom import minidom
import requests

def report(owl):
    #GETS THE MOST RECENT OBSERVATION FROM BOTH USA AND CANADA
    usa_xml = requests.get('http://ebird.org/ws1.1/data/obs/region_spp/recent?rtype=country&r=US&sci=surnia%20ulula&back=30&maxResults=1&includeProvisional=true')
    canada_xml = requests.get('http://ebird.org/ws1.1/data/obs/region_spp/recent?rtype=country&r=CA&sci=surnia%20ulula&back=30&maxResults=1&includeProvisional=true')
    usa_parsed = minidom.parseString(usa_xml.text)
    canada_parsed = minidom.parseString(canada_xml.text)

    #COMPARES THE RESULTS AND RETURNS THE MOST RECENT
    usa_raw_date = usa_parsed.getElementsByTagName('obs-dt')
    canada_raw_date = canada_parsed.getElementsByTagName('obs-dt')
    for date in usa_raw_date:
        usa_date = str(date.childNodes[0].nodeValue)   
    for date in canada_raw_date:
        canada_date = str(date.childNodes[0].nodeValue)
    if int(usa_date[0:4]) > int(canada_date[0:4]):
        most_recent = usa_date
    elif int(usa_date[5:7]) > int(canada_date[5:7]):
        most_recent = usa_date
    elif int(usa_date[8:10]) > int(canada_date[8:10]):
        most_recent = usa_date
    elif int(usa_date[11:13]) > int(canada_date[11:13]):
        most_recent = usa_date
    elif int(usa_date[14:16]) > int(canada_date[14:16]):
        most_recent = usa_date
    else:
        most_recent = canada_date
    return most_recent

使用datetime.datetime.strftime()將日期解析為datetime.datetime()對象,然后使用max()返回更大的值(最近的):

usa_date = datetime.datetime.strptime(
    usa_raw_date[-1].childNodes[0].nodeValue, '%Y-%m-%d %H:%M')
canada_date = datetime.datetime.strptime(
    canada_raw_date[-1].childNodes[0].nodeValue, '%Y-%m-%d %H:%M')
return max(usa_date, canada_date)

現在針對您提供的URL運行此操作,結果是:

>>> usa_date = datetime.datetime.strptime(
...     usa_raw_date[-1].childNodes[0].nodeValue, '%Y-%m-%d %H:%M')
>>> canada_date = datetime.datetime.strptime(
...     canada_raw_date[-1].childNodes[0].nodeValue, '%Y-%m-%d %H:%M')
>>> usa_date, canada_date
(datetime.datetime(2014, 5, 5, 11, 0), datetime.datetime(2014, 5, 11, 18, 0))
>>> max(usa_date, canada_date)
datetime.datetime(2014, 5, 11, 18, 0)

這將返回datetime.datetime()對象; 如果返回一個字符串對你很重要,你總是可以返回:

return max(usa_date, canada_date).strftime('%Y-%m-%d %H:%M')

例如,再次將datetime對象格式化為字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM