Форум сайта python.su
можно так
from decimal import Decimal q = Decimal('0.00') a = 1.00 b = 0.75 c = 0.00 x = [a,b,c] print (Decimal(min(x)).quantize(q))
Офлайн
vic57
#…
for bl in block:
ikao = bl.find('station_id').text
clouds = bl.findall('sky_condition')
out =
for i in clouds:
out.append(i.get('sky_cover'))
print ikao,' '.join(out)
Офлайн
d = {'OVC':1.00,'BKN': 0.75,'SCT':0.40,'FEW':0.15,'SKC':0.00,'CLR':0} for bl in block: ikao = bl.find('station_id').text clouds = bl.findall('sky_condition') out = [] for i in clouds: key = i.get('sky_cover') out.append(d[key]) if out: print ikao,out,max(out) else: print ikao
Отредактировано vic57 (Март 1, 2017 02:07:08)
Офлайн
Зря надеялся, что вопрос последний.
Не буду заваливать своими кодами. Сам разберусь, но хочется понять принцип.
Допустим имею два файла 1.txt и 2.txt
1.txt
ODIN 11 12 13
DVA 21 22 23
TRI 31 32 33
NULL 01 02 03
DVA 444 555
CHE 344 324
TRI 777 888
SEM 987 435
ODIN 999 000
Отредактировано Tenebras (Март 1, 2017 03:21:35)
Офлайн
Tenebras, читаете оба файла в словари, чтобы получилось что-то вроде этого:
# odin_txt = {'ODIN': [11, 12, 13], ...} dva_txt = {...}
Офлайн
Если файлы не слишком большие, то можно попробовать, например, так:
import pandas as pd data1 = pd.read_table('one.txt', header=None, sep='\s+', na_values='NA', keep_default_na=False) data2 = pd.read_table('two.txt', header=None, sep='\s+', na_values='NA', keep_default_na=False) result = [] for ind, item in data1.iterrows(): res = data2.ix[data2[0]==item[0], :] if not res.empty: ss = pd.concat([data1.iloc[ind, :], res.iloc[0,1:]]) else: ss = data1.iloc[ind,:] result.append(ss.tolist()) print(result) # save results to a new file
Офлайн
def fn(d,l,flag=True): for i in l: tmp = i.strip().split(' ') key = tmp[0] if not key in d: if not flag: continue else: d[key] = [] for i in tmp[1:]: d[key].append(i) return d f1 = open('1.txt').readlines() f2 = open('2.txt').readlines() d = fn({},f1,True) d = fn(d,f2,False) for i in d:print i,d[i]
Отредактировано vic57 (Март 1, 2017 09:15:33)
Офлайн
Пришёл к выводу, что проще и понятнее для меня будет сделать иначе. Но и тут вопрос.
Для начала код (упростил и укоротил его для примера только)
#!/usr/bin/env python # coding:utf8 from lxml import etree import urllib url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml' urllib.urlretrieve(url, filename='metar.xml') tree = etree.parse('metar.xml') # Парсинг файла block = tree.xpath('/response/data/METAR') qwerty = ['ULLI', 'UBBL', 'LRCT'] for a in qwerty: for b in block: ikao = b.find('station_id').text if ikao != a: continue clouds = b.findall('sky_condition') time = b.find('observation_time').text tim = time.split(r'T') ti = tim[1].split(r':') t = ti[0]+':'+ti[1] out = [] for i in clouds: out.append(i.get('sky_cover')) print ikao,str(t) ,' '.join(out) break
Офлайн
это принципиально - каждый раз всё обрабатывать?
можно скачать в базу данных и делать update/select для тех станций, которые тебе нужны
и как ты алгоритмы придумываешь?
#!/usr/bin/env python # coding:utf8 from lxml import etree import urllib import time tp1 = time.time() url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml' urllib.urlretrieve(url, filename='metar.xml') tp2 = time.time() tree = etree.parse('metar.xml') # Парсинг файла block = tree.xpath('/response/data/METAR') qwerty = ['ULLI', 'UBBL', 'LRCT'] for b in block: ikao = b.find('station_id').text if not ikao in qwerty: continue clouds = b.findall('sky_condition') time0 = b.find('observation_time').text tim = time0.split(r'T') ti = tim[1].split(r':') t = ti[0]+':'+ti[1] out = [] for i in clouds: out.append(i.get('sky_cover')) print ikao,str(t) ,' '.join(out) tp3 = time.time() print 'execution time',tp2 - tp1,tp3 - tp2
ULLI 05:00 OVC UBBL 05:00 OVC LRCT 05:00 BKN execution time 19.0136210918 0.384562015533
Отредактировано vic57 (Март 2, 2017 07:48:14)
Офлайн
На разных станциях в разное время может быть или не быть информации. Поэтому список меняется.
Показатели облаков - меняются постоянно…
и как ты алгоритмы придумываешь?
Офлайн