我有這個由隕石著陸組成的 JSON 資料集,我想找到過去 10 年中質量最高的隕石著陸。
JSON 示例:
[
{
"name": "Aachen",
"id": "1",
"nametype": "Valid",
"recclass": "L5",
"mass": "21",
"fall": "Fell",
"year": "1880-01-01T00:00:00.000",
"reclat": "50.775000",
"reclong": "6.083330",
"geolocation": {
"type": "Point",
"coordinates": [
6.08333,
50.775
]
}
},
{
"name": "Aarhus",
"id": "2",
"nametype": "Valid",
"recclass": "H6",
"mass": "720",
"fall": "Fell",
"year": "1951-01-01T00:00:00.000",
"reclat": "56.183330",
"reclong": "10.233330",
"geolocation": {
"type": "Point",
"coordinates": [
10.23333,
56.18333
]
}
},
我的代碼如下。我已經得到了過去 10 年的日期范圍,但無法將日期范圍內的質量聯系起來。
import json, datetime
from dateutil.relativedelta import relativedelta
f = open('nasadata.json')
data = json.load(f)
start_date = datetime.datetime.now() - relativedelta(years = 10)
end_date = datetime.datetime.now()
for item in data:
year = item.get('year')
if year is not None:
year = datetime.datetime.strptime(year, "%Y-%m-%dT%H:%M:%S.%f")
name = item.get('name')
mass = item.get('mass')
if year is not None and year >= start_date and year <= end_date:
max_mass = max(mass)
print(max_mass)
如何遍歷 JSON 以獲得 10 年日期范圍內的最大質量隕石名稱和質量值?
uj5u.com熱心網友回復:
我會通過在格式中維護日期來進行輕微優化,"%Y-%m-%dT%H:%M:%S.%f"因為它們可以按字母順序排序。你也不需要比較,now因為大概沒有記錄未來的隕石墜落?那么你的代碼可以是:
start_date = datetime.datetime.now() - relativedelta(years = 10)
start_date = start_date.strftime("%Y-%m-%dT%H:%M:%S.%f")
recent = [m for m in data if m.get('year', '0') >= start_date]
heaviest = sorted(recent, key=lambda m:float(m.get('mass', 0)), reverse=True)[0]
print(heaviest)
uj5u.com熱心網友回復:
稍微修改一下你的回圈實作,并在 if 子句中檢查資料中現在和一年之間的年份差異,如果質量在過去 10 年中最大,則保留隕石的地名。
最后,在回圈之外,檢查是否存在有效資料。例如,在當前輸入中,沒有有效資料(所有年份都在 10 年之外)。
from datetime import datetime
from dateutil.relativedelta import relativedelta
now = datetime.now()
max_mass = 0
max_mass_name = None
start_date = (datetime.now() - relativedelta(years=10)).strftime("%Y-%m-%dT%H:%M:%S.%f")
for item in data:
year = item.get('year', '0')
mass = float(item.get('mass', 0))
# if year is more recent than 10 years prior to today and
# if its corresponding mass is the greatest so far (among those in the last 10 years),
# then save its name
if year >= start_date and mass > max_mass:
max_mass = mass
max_mass_name = item.get('name')
# check if a valid data exists
max_mass_name = max_mass_name if max_mass_name is not None else 'No such data'
uj5u.com熱心網友回復:
您可以將年份保留為文本格式,因為它可以按字母順序排序。
使用以下代碼:
import datetime
originalJson = [{...}]
today = datetime.datetime.now()
tenYearsAgo = today.replace(year=today.year-10)
filteredByLastTenYears = list(filter(lambda d: datetime.datetime.strptime(d['year'], '%Y-%m-%dT%H:%M:%S.%f') > tenYearsAgo, originalJson))
sortedByMass = sorted(filteredByLastTenYears, key=lambda d: d['mass'],reverse=True)
highestMass = sortedByMass[0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504602.html
標籤:Python json python-3.x
下一篇:打開pdf頁面
