diff --git a/gallery/painting/gismeteo/api.py b/gallery/painting/gismeteo/api.py
index bd5c829..88973f2 100644
--- a/gallery/painting/gismeteo/api.py
+++ b/gallery/painting/gismeteo/api.py
@@ -12,12 +12,22 @@ from gallery.sketch.weather.api import WeatherApi
from gallery.sketch.weather.model import Location, WeatherResponse, WeatherValue
from gallery.sketch.weather.util import merge_weather_values
-from . import datehelp
from .parser import DAYS_PARSER, LOCATION_PARSER, ONE_DAY_PARSER, ROW_PARSERS
logger = logging.getLogger("gismeteo")
+def format_date(date: datetime.date) -> str:
+ today = datetime.date.today()
+ days = (date - today).days
+ if days == 0:
+ return "today"
+ elif days == 1:
+ return "tomorrow"
+ else:
+ return f"{days + 1}-day"
+
+
class GismeteoApi(WeatherApi):
PROVIDER = "gismeteo"
@@ -107,7 +117,7 @@ class GismeteoApi(WeatherApi):
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail={"max_date": max_date.strftime("%Y-%m-%d")}
)
- data = await self.source.request(f"weather-{location_id}/{datehelp.dump(date)}")
+ data = await self.source.request(f"weather-{location_id}/{format_date(date)}")
return self._parse_oneday(date, data)
async def get_days(self, location_id: str, days: int) -> WeatherResponse:
diff --git a/gallery/painting/gismeteo/core.py b/gallery/painting/gismeteo/core.py
deleted file mode 100644
index b168e57..0000000
--- a/gallery/painting/gismeteo/core.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from typing import Generic, Iterable, Optional, TypeVar
-
-from bs4 import Tag
-
-T = TypeVar("T")
-
-
-class WidgetParser:
- def parse_widget(self, tag: Tag) -> Tag:
- raise NotImplementedError
-
-
-class BaseWidgetParser(WidgetParser):
- SELECT: str
-
- def __init__(self, select: Optional[str] = None):
- super().__init__()
- self._select = select or self.SELECT
-
- def parse_widget(self, tag: Tag) -> Tag:
- widget = tag.select_one(self._select)
- if widget is None:
- raise ValueError(self._select)
- return widget
-
-
-class RowParser(Generic[T]):
- KEY: str
-
- def parse_row(self, tag: Tag) -> Iterable[T]:
- raise NotImplementedError
diff --git a/gallery/painting/gismeteo/datehelp.py b/gallery/painting/gismeteo/datehelp.py
deleted file mode 100644
index 196a604..0000000
--- a/gallery/painting/gismeteo/datehelp.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import datetime
-from enum import Enum
-
-import dateparser
-import dateparser.date_parser
-
-
-class Day(str, Enum):
- TODAY = "today"
- TOMORROW = "tomorrow"
- DAY_3 = "3-day"
- DAY_4 = "4-day"
- DAY_5 = "5-day"
-
-
-def parse(value: str) -> datetime.date:
- if value in ["today", "mock"]:
- return datetime.date.today()
- elif value == "tomorrow":
- return datetime.date.today() + datetime.timedelta(days=1)
- elif value.endswith("-day"):
- days = int(value.split("-")[0]) - 1
- return datetime.date.today() + datetime.timedelta(days=days)
- else:
- date = dateparser.parse(value)
- if date is None:
- raise ValueError(value)
- return date.date()
-
-
-def dump(date: datetime.date) -> str:
- today = datetime.date.today()
- days = (date - today).days
- if days == 0:
- return "today"
- elif days == 1:
- return "tomorrow"
- else:
- return f"{days + 1}-day"
diff --git a/gallery/painting/gismeteo/parser.py b/gallery/painting/gismeteo/parser.py
index 017da50..56f5d24 100644
--- a/gallery/painting/gismeteo/parser.py
+++ b/gallery/painting/gismeteo/parser.py
@@ -1,7 +1,7 @@
import datetime
import logging
import re
-from typing import Iterable
+from typing import Generic, Iterable, Optional, TypeVar
import dateparser
from bs4 import Tag
@@ -14,10 +14,37 @@ from gallery.sketch.weather.model import (
)
from gallery.sketch.weather.parser import ParseError, parse_wind_direction
-from .core import BaseWidgetParser, RowParser
-
logger = logging.getLogger("gismeteo")
+T = TypeVar("T")
+
+
+class WidgetParser:
+ def parse_widget(self, tag: Tag) -> Tag:
+ raise NotImplementedError
+
+
+class BaseWidgetParser(WidgetParser):
+ SELECT: str
+
+ def __init__(self, select: Optional[str] = None):
+ super().__init__()
+ self._select = select or self.SELECT
+
+ def parse_widget(self, tag: Tag) -> Tag:
+ widget = tag.select_one(self._select)
+ if widget is None:
+ raise ValueError(self._select)
+ return widget
+
+
+class RowParser(Generic[T]):
+ KEY: str
+
+ def parse_row(self, tag: Tag) -> Iterable[T]:
+ raise NotImplementedError
+
+
ONE_DAY_PARSER = BaseWidgetParser(".widget.widget-oneday .widget-items")
DAYS_PARSER = BaseWidgetParser(".widget.widget-days .widget-items")
diff --git a/gallery/painting/rp5/parser.py b/gallery/painting/rp5/parser.py
index b98129c..c53383e 100644
--- a/gallery/painting/rp5/parser.py
+++ b/gallery/painting/rp5/parser.py
@@ -1,4 +1,6 @@
import re
+from enum import Enum, auto
+from typing import Iterable
import dateparser
from bs4 import BeautifulSoup, Tag
@@ -36,72 +38,109 @@ def _parse_wind_speed(cell: Tag) -> int:
return 0
+class RowType(Enum):
+ DATE = auto()
+ TIME = auto()
+ CLOUDNESS = auto()
+ PRECIPITATION = auto()
+ TEMPERATURE = auto()
+ PRESSURE = auto()
+ WIND_SPEED = auto()
+ WIND_GUST = auto()
+ WIND_DIRECTION = auto()
+ HUMIDITY = auto()
+
+
+def _iter_table_rows(table: Tag) -> Iterable[tuple[RowType, Tag]]:
+ for row in table.select("tr"):
+ title = row.select_one("td").text.strip().lower()
+ if "сегодня" in title:
+ yield RowType.DATE, row
+ elif "местное время" in title:
+ yield RowType.TIME, row
+ elif "облачность" in title:
+ yield RowType.CLOUDNESS, row
+ elif "осадки" in title:
+ yield RowType.PRECIPITATION, row
+ elif "температура" in title:
+ yield RowType.TEMPERATURE, row
+ elif "давление" in title:
+ yield RowType.PRESSURE, row
+ elif "скорость" in title:
+ yield RowType.WIND_SPEED, row
+ elif "порывы" in title:
+ yield RowType.WIND_GUST, row
+ elif "направление" in title:
+ yield RowType.WIND_DIRECTION, row
+ elif "влажность" in title:
+ yield RowType.HUMIDITY, row
+
+
# pylint:disable=too-many-branches
def parse_page(page: BeautifulSoup) -> list[WeatherResponse]:
location = page.select(".intoLeftNavi > .verticalBottom > a")[-1].text.strip()
table = page.select_one("#forecastTable")
if table is None:
raise ParseError("#forecastTable not found")
- (
- date_row,
- time_row,
- cloudness_row,
- precipitation_row,
- temperature_row,
- pressure_row,
- wind_speed_row,
- wind_gust_row,
- wind_direction_row,
- humidity_row,
- *_,
- ) = table.select("tr")
result: list[WeatherResponse] = []
values: list[WeatherValue] = []
- for index, cell in enumerate(date_row.select("td")):
- colspan = int(cell.attrs["colspan"])
- if index == 0:
- colspan -= 1
- date_str = ",".join(cell.text.strip().split(",")[-2:])
- date = dateparser.parse(date_str, languages=["ru"])
- if date is None:
- raise ParseError.invalid_date(date_str)
- item_values = [build_weather_value(date) for _ in range(colspan)]
- result.append(
- WeatherResponse(
- location=location,
- date=date.date(),
- period="day",
- values=item_values,
- )
- )
- values += item_values
- for index, cell in enumerate(time_row.select("td")[1:]):
- hour = int(cell.text.strip())
- values[index].date = values[index].date.replace(hour=hour)
- for index, cell in enumerate(cloudness_row.select("td")[1:]):
- onmouseover = cell.select_one(".cc_0").next_element.attrs["onmouseover"]
- cloudness_str = re.compile("(.*?)").search(onmouseover).group(1).strip()
- values[index].sky.cloudness = CLOUDNESS_MAP[cloudness_str]
- for index, cell in enumerate(precipitation_row.select("td")[1:]):
- onmouseover = cell.select_one(".pr_0").attrs["onmouseover"]
- precipitation_str = onmouseover.split(",")[1].strip(" '")
- precipitation_value_matched = re.compile("(\\d+\\.\\d+) мм").search(precipitation_str)
- if precipitation_value_matched:
- # one hour value
- values[index].precipitation = float(precipitation_value_matched.group(1)) * 6
- if "(" in precipitation_str:
- precipitation_str = precipitation_str.split(" (")[0]
- values[index].sky.precipitation = PRECIPITATION_MAP[precipitation_str]
- for index, cell in enumerate(temperature_row.select("td")[1:]):
- values[index].temperature = [int(cell.select_one(".t_0").text.lstrip("+").strip())]
- for index, cell in enumerate(pressure_row.select("td")[1:]):
- values[index].pressure = [int(cell.select_one(".p_0").text.strip())]
- for index, cell in enumerate(wind_speed_row.select("td")[1:]):
- values[index].wind_speed = _parse_wind_speed(cell)
- for index, cell in enumerate(wind_gust_row.select("td")[1:]):
- values[index].wind_gust = _parse_wind_speed(cell)
- for index, cell in enumerate(wind_direction_row.select("td")[1:]):
- values[index].wind_direction = parse_wind_direction(cell.text.strip())
- for index, cell in enumerate(humidity_row.select("td")[1:]):
- values[index].humidity = int(cell.text.strip())
+ for row_type, row in _iter_table_rows(table):
+ match row_type:
+ case RowType.DATE:
+ for index, cell in enumerate(row.select("td")):
+ colspan = int(cell.attrs["colspan"])
+ if index == 0:
+ colspan -= 1
+ date_str = ",".join(cell.text.strip().split(",")[-2:])
+ date = dateparser.parse(date_str, languages=["ru"])
+ if date is None:
+ raise ParseError.invalid_date(date_str)
+ item_values = [build_weather_value(date) for _ in range(colspan)]
+ result.append(
+ WeatherResponse(
+ location=location,
+ date=date.date(),
+ period="day",
+ values=item_values,
+ )
+ )
+ values += item_values
+ case RowType.TIME:
+ for index, cell in enumerate(row.select("td")[1:]):
+ hour = int(cell.text.strip())
+ values[index].date = values[index].date.replace(hour=hour)
+ case RowType.CLOUDNESS:
+ for index, cell in enumerate(row.select("td")[1:]):
+ onmouseover = cell.select_one(".cc_0").next_element.attrs["onmouseover"]
+ cloudness_str = re.compile("(.*?)").search(onmouseover).group(1).strip()
+ values[index].sky.cloudness = CLOUDNESS_MAP[cloudness_str]
+ case RowType.PRECIPITATION:
+ for index, cell in enumerate(row.select("td")[1:]):
+ onmouseover = cell.select_one(".pr_0").attrs["onmouseover"]
+ precipitation_str = onmouseover.split(",")[1].strip(" '")
+ precipitation_value_matched = re.compile("(\\d+\\.\\d+) мм").search(precipitation_str)
+ if precipitation_value_matched:
+ # one hour value
+ values[index].precipitation = float(precipitation_value_matched.group(1)) * 6
+ if "(" in precipitation_str:
+ precipitation_str = precipitation_str.split(" (")[0]
+ values[index].sky.precipitation = PRECIPITATION_MAP[precipitation_str]
+ case RowType.TEMPERATURE:
+ for index, cell in enumerate(row.select("td")[1:]):
+ values[index].temperature = [int(cell.select_one(".t_0").text.lstrip("+").strip())]
+ case RowType.PRESSURE:
+ for index, cell in enumerate(row.select("td")[1:]):
+ values[index].pressure = [int(cell.select_one(".p_0").text.strip())]
+ case RowType.WIND_SPEED:
+ for index, cell in enumerate(row.select("td")[1:]):
+ values[index].wind_speed = _parse_wind_speed(cell)
+ case RowType.WIND_GUST:
+ for index, cell in enumerate(row.select("td")[1:]):
+ values[index].wind_gust = _parse_wind_speed(cell)
+ case RowType.WIND_DIRECTION:
+ for index, cell in enumerate(row.select("td")[1:]):
+ values[index].wind_direction = parse_wind_direction(cell.text.strip())
+ case RowType.HUMIDITY:
+ for index, cell in enumerate(row.select("td")[1:]):
+ values[index].humidity = int(cell.text.strip())
return result
diff --git a/tests/data/rp5/weather.html b/tests/data/rp5/weather.html
index 0866690..3644a73 100644
--- a/tests/data/rp5/weather.html
+++ b/tests/data/rp5/weather.html
@@ -6,11 +6,11 @@
Погода в Орле, Орловская область - РП5
-
+
@@ -59,15 +59,15 @@
t_p1 = "Атмосферное давление у поверхности земли (дюймы ртутного столба)", t_p2 = "Атмосферное давление у поверхности земли (миллибары)", t_p3 = "Атмосферное давление у поверхности земли (гектопаскали)",
t_wv0 = "Ветер на высоте 10 метров (метры в секунду)", t_wv1 = "Ветер на высоте 10 метров (километры в час)", t_wv2 = "Ветер на высоте 10 метров (мили в час)",
t_wv3 = "Ветер на высоте 10 метров (узлы)", t_wv4 = "Ветер на высоте 10 метров (баллы Бофорта)",
- t_ft0 = "Температура с учётом влияния ветра и влажности (градусы Цельсия)", t_ft1 = "Температура с учётом влияния ветра и влажности (градусы Фаренгейта)"; cRp5TxtHref="https://txt.rp5.ru/?AdvertMgmt=new&targetPlace=p003000080002239000000631802&check=401cf1c01f996bf"; cAdvertMgmtClass="b8a584247184083a88446c9a8600280e65cab1d40";var _0x2e66=["\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x42\x6F\x74\x74\x6F\x6D","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x2e66[1]][_0x2e66[0]] = "#b4e9a7567d80113db2d81947da14069a6094ab314";var _0x248f=["\x63\x41\x42\x4E\x6F\x43\x68\x65\x63\x6B","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x248f[1]][_0x248f[0]] = ".";var _0x751f=["\x73\x41\x64\x49\x64\x53\x65\x6E\x73\x65\x52\x69\x67\x68\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x751f[1]][_0x751f[0]] = "#bc5e74b9d245e46bb696fdb929fb13eafc9678d45";var _0x14c2=["\x73\x41\x64\x49\x64\x53\x65\x6E\x73\x65\x42\x6F\x74\x74\x6F\x6D","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x14c2[1]][_0x14c2[0]] = "#bb324079366864d8ecaa5cb7b1446";
+ t_ft0 = "Температура с учётом влияния ветра и влажности (градусы Цельсия)", t_ft1 = "Температура с учётом влияния ветра и влажности (градусы Фаренгейта)"; cRp5TxtHref="https://txt.rp5.ru/?AdvertMgmt=new&targetPlace=p003000080002239000000631802&check=401cf1c01f996bf"; cAdvertMgmtClass="o3de1f464a9d721adb6120ca505c60aeaddf5e47c";var _0x2e66=["\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x42\x6F\x74\x74\x6F\x6D","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x2e66[1]][_0x2e66[0]] = "#o1cd530eb1fec4685da3c4d6095d829d957c6c597";var _0x248f=["\x63\x41\x42\x4E\x6F\x43\x68\x65\x63\x6B","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x248f[1]][_0x248f[0]] = ".";var _0x6a2d=["\x73\x41\x64\x49\x64\x53\x65\x6E\x73\x65\x52\x69\x67\x68\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x6a2d[1]][_0x6a2d[0]] = "#od4c577505bb83801cb4e7404b26dcebac0590501";var _0x5bd5=["\x73\x41\x64\x49\x64\x53\x65\x6E\x73\x65\x42\x6F\x74\x74\x6F\x6D","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x5bd5[1]][_0x5bd5[0]] = "#oe65347c5afb5f2b6c2a7a73fe47ae94";
var sRp5TxtHref = "https://txt.rp5.ru/?AdvertMgmt=new&targetPlace=p003000080002239000000631802&check=401cf1c01f996bf";
- var sABWarning = "Обнapужeнa блокиpовкa peклaмы (eдинcтвeнного иcточникa доходa caйтa rp5.ru). Пожaлуйcтa, отключитe (в cвоём бpaузepe, опepaционной cиcтeмe или локaльной ceти) блокиpовку peклaмы для вышeукaзaнного caйтa. В cлучae cохpaнeния блокиpовки peклaмы, мы будeм вынуждeны блокиpовaть для вac дaнныe о погодe.";
+ var sABWarning = "Обнaружeнa блoкирoвкa рeклaмы (eдинствeннoгo истoчникa дoхoдa сaйтa rp5.ru). Пoжaлуйстa, oтключитe (в свoём брaузeрe, oпeрaциoннoй систeмe или лoкaльнoй сeти) блoкирoвку рeклaмы для вышeукaзaннoгo сaйтa. В случae сoхрaнeния блoкирoвки рeклaмы, мы будeм вынуждeны блoкирoвaть для вaс дaнныe o пoгoдe.";
var sHtmlBlock = "";
var sContentBottom = "";
- var _0x55c1=["\x73\x41\x42\x4D\x65\x73\x73\x31","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x55c1[1]][_0x55c1[0]] = "Блокировка рeкламы";var _0x52c3=["\x73\x41\x42\x57\x61\x72\x6E\x69\x6E\x67\x31","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x52c3[1]][_0x52c3[0]] = "Обнapужeнa блокиpовкa peклaмы (eдинcтвeнного иcточникa доходa caйтa rp5.ru). Пожaлуйcтa, отключитe (в cвоём бpaузepe, опepaционной cиcтeмe или локaльной ceти) блокиpовку peклaмы для вышeукaзaнного caйтa. В cлучae cохpaнeния блокиpовки peклaмы, мы будeм вынуждeны блокиpовaть для вac дaнныe о погодe."; cSearch = "Название города или села";
+ var _0x2429=["\x73\x41\x42\x4D\x65\x73\x73\x31","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x2429[1]][_0x2429[0]] = "Блокировка рeкламы";var _0x9a7c=["\x73\x41\x42\x57\x61\x72\x6E\x69\x6E\x67\x31","\x64\x6F\x63\x75\x6D\x65\x6E\x74"];this[_0x9a7c[1]][_0x9a7c[0]] = "Обнaружeнa блoкирoвкa рeклaмы (eдинствeннoгo истoчникa дoхoдa сaйтa rp5.ru). Пoжaлуйстa, oтключитe (в свoём брaузeрe, oпeрaциoннoй систeмe или лoкaльнoй сeти) блoкирoвку рeклaмы для вышeукaзaннoгo сaйтa. В случae сoхрaнeния блoкирoвки рeклaмы, мы будeм вынуждeны блoкирoвaть для вaс дaнныe o пoгoдe."; cSearch = "Название города или села";
@@ -432,7 +432,7 @@
-
+
-
+
|
@@ -464,21 +464,21 @@
|
- это сайт, с которого распечатан данный прогноз. Чтобы узнать больше, посетите сайт. |
-
| | | | | | | |
| Местное время | 21 | 03 | 09 | 15 | 21 | 03 | 09 | 15 | 21 | 03 | 09 | 15 | 21 | 03 | 09 | 15 | 21 | 03 | 09 | 15 | 21 | 03 | 09 | 15 | 21 | 03 |
| Облачность, % 1/10 окты | | | | | | | | | | | | | | | | | | | | | | | | | | |
| Осадки, мм Осадки, дюймы | | | | | | | | | | | | | | | | | | | | | | | | | | |
| Температура, °C °F | +18 +64 | +15 +59 | +14 +57 | +20 +68 | +11 +52 | +7 +45 | +14 +57 | +18 +64 | +12 +54 | +9 +48 | +13 +55 | +20 +68 | +11 +52 | +5 +41 | +11 +52 | +21 +70 | +12 +54 | +7 +45 | +14 +57 | +20 +68 | +11 +52 | +4 +39 | +13 +55 | +21 +70 | +13 +55 | +8 +46 |
| Ощущается как, °C °F | | | | | | | | | | | | | | | | | | | | | | +3 +37 | | | | |
| Давление, мм рт. ст. дюймы мбар гПа | 745 29.33 993 993 | 745 29.33 993 993 | 748 29.45 997 997 | 749 29.49 999 999 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 749 29.49 999 999 | 748 29.45 997 997 | 747 29.41 996 996 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 |
| Ветер: скорость, м/с км/ч мили/час узлы Бфрт | 2 7 4 4 2 | 2 7 4 4 2 | 4 14 9 8 3 | 5 18 11 10 3 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 2 7 4 4 2 | 0 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 0 | 1 4 2 2 1 | 0 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 2 7 4 4 2 | 1 4 2 2 1 | 1 4 2 2 1 |
| порывы, м/с км/ч мили/час узлы Бфрт | | | 9 32 20 17 5 | 12 43 27 23 6 | | | | 5 18 11 10 3 | | | | 4 14 9 8 3 | | | | | | | | | | | | 6 22 13 12 4 | | |
| направление | Ю | Ю-З | З | З | З | Ю-З | З | З | ШТЛ | ШТЛ | С | С | ШТЛ | Ю | ШТЛ | ШТЛ | Ю-В | Ю-В | Ю-В | ШТЛ | Ю-В | С-В | С | В | В | С |
| Влажность, % | 82 | 81 | 84 | 43 | 89 | 96 | 71 | 53 | 100 | 100 | 73 | 43 | 81 | 100 | 82 | 37 | 78 | 91 | 68 | 41 | 89 | 100 | 71 | 47 | 100 | 100 |
| Солнце: восход заход | 19:04 | | 06:02 | 19:01 | | | 06:04 | 18:59 | | | 06:06 | 18:57 | | | 06:07 | 18:54 | | | 06:09 | 18:52 | | | 06:11 | 18:49 | | 06:13 |
| Луна: восход заход | 18:39 | | 06:14 | 18:50 | | | 07:37 | 19:01 | | | 08:58 | 19:12 | | | 10:19 | 19:25 | | | 11:38 | 19:42 | | | 12:55 | 20:05 | | 14:07 |
| фаза | | | | | | | | |
Сегодня, четверг, 10 сентября | Завтра, пятница, 11 сентября | | | | | | |
| Местное время | 19 | 20 | 21 | 22 | 23 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 21 | 00 | 03 | 06 | 09 | 12 | 15 | 18 | 21 | 00 | 03 | 06 | 09 | 12 | 15 | 18 | 21 | 00 | 03 | 06 | 09 | 12 | 15 | 18 | 21 | 00 | 03 | Местное время |
| Облачность, % 1/10 окты | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Облачность, % 1/10 окты |
| Осадки, мм Осадки, дюймы | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Осадки, мм Осадки, дюймы |
| Температура, °C °F | +20 +68 | +19 +66 | +18 +64 | +17 +63 | +17 +63 | +16 +61 | +16 +61 | +15 +59 | +15 +59 | +14 +57 | +15 +59 | +15 +59 | +14 +57 | +14 +57 | +14 +57 | +15 +59 | +17 +63 | +18 +64 | +19 +66 | +20 +68 | +20 +68 | +19 +66 | +18 +64 | +16 +61 | +14 +57 | +13 +55 | +11 +52 | +10 +50 | +9 +48 | +9 +48 | +8 +46 | +7 +45 | +7 +45 | +6 +43 | +7 +45 | +7 +45 | +8 +46 | +11 +52 | +14 +57 | +16 +61 | +17 +63 | +17 +63 | +18 +64 | +19 +66 | +18 +64 | +17 +63 | +16 +61 | +14 +57 | +13 +55 | +13 +55 | +12 +54 | +11 +52 | +11 +52 | +11 +52 | +10 +50 | +9 +48 | +9 +48 | +9 +48 | +10 +50 | +9 +48 | +9 +48 | +11 +52 | +13 +55 | +15 +59 | +17 +63 | +18 +64 | +18 +64 | +20 +68 | +20 +68 | +15 +59 | +11 +52 | +7 +45 | +5 +41 | +5 +41 | +11 +52 | +18 +64 | +21 +70 | +17 +63 | +12 +54 | +10 +50 | +7 +45 | +7 +45 | +14 +57 | +18 +64 | +20 +68 | +16 +61 | +11 +52 | +8 +46 | +4 +39 | +4 +39 | +13 +55 | +19 +66 | +21 +70 | +16 +61 | +13 +55 | +10 +50 | +8 +46 | Температура, °C °F |
| Ощущается как, °C °F | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +3 +37 | +3 +37 | | | | | | | | Ощущается как, °C °F |
| Давление, мм рт. ст. дюймы мбар гПа | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 746 29.37 995 995 | 746 29.37 995 995 | 747 29.41 996 996 | 747 29.41 996 996 | 748 29.45 997 997 | 748 29.45 997 997 | 748 29.45 997 997 | 748 29.45 997 997 | 748 29.45 997 997 | 748 29.45 997 997 | 749 29.49 999 999 | 749 29.49 999 999 | 749 29.49 999 999 | 749 29.49 999 999 | 749 29.49 999 999 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 750 29.53 1000 1000 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 751 29.57 1001 1001 | 750 29.53 1000 1000 | 749 29.49 999 999 | 749 29.49 999 999 | 749 29.49 999 999 | 748 29.45 997 997 | 748 29.45 997 997 | 747 29.41 996 996 | 747 29.41 996 996 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | 745 29.33 993 993 | Давление, мм рт. ст. дюймы мбар гПа |
| Ветер: скорость, м/с км/ч мили/час узлы Бфрт | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 3 11 7 6 2 | 3 11 7 6 2 | 4 14 9 8 3 | 4 14 9 8 3 | 3 11 7 6 2 | 4 14 9 8 3 | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 4 14 9 8 3 | 4 14 9 8 3 | 3 11 7 6 2 | 2 7 4 4 2 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 0 | 0 | 0 | 0 | 0 | 1 4 2 2 1 | 0 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 2 7 4 4 2 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 0 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 0 | 1 4 2 2 1 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 0 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | 3 11 7 6 2 | 2 7 4 4 2 | 2 7 4 4 2 | 1 4 2 2 1 | 1 4 2 2 1 | 1 4 2 2 1 | Ветер: скорость, м/с км/ч мили/час узлы Бфрт |
| порывы, м/с км/ч мили/час узлы Бфрт | | | | | | | | | | | 6 22 13 12 4 | 8 29 18 16 5 | 9 32 20 17 5 | 8 29 18 16 5 | 9 32 20 17 5 | 10 36 22 19 5 | 10 36 22 19 5 | 10 36 22 19 5 | 11 40 25 21 6 | 11 40 25 21 6 | 12 43 27 23 6 | 11 40 25 21 6 | 10 36 22 19 5 | 9 32 20 17 5 | 7 25 16 14 4 | | | | | | | | | | | | | | | | | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | | 4 14 9 8 3 | | | | | | | | | | | | | | | | | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 5 18 11 10 3 | 4 14 9 8 3 | 4 14 9 8 3 | | | | | | | | | | | | | | | | | | | | | | | 7 25 16 14 4 | 6 22 13 12 4 | | | | | порывы, м/с км/ч мили/час узлы Бфрт |
| направление | Ю | Ю | Ю | Ю | Ю | Ю | Ю | Ю-З | Ю-З | З | З | З | С-З | З | З | З | З | З | З | З | З | З | З | З | З | З | З | З | Ю-З | З | Ю-З | Ю-З | Ю-З | Ю-З | Ю-З | Ю-З | Ю-З | Ю-З | З | З | З | З | З | З | З | З | З | Ю-З | Ю-З | Ю-З | ШТЛ | ШТЛ | ШТЛ | ШТЛ | ШТЛ | С | ШТЛ | ШТЛ | С | С | С | С | С | С-В | С-В | С-В | С-В | С | С | С | ШТЛ | ШТЛ | Ю | Ю | ШТЛ | Ю-З | ШТЛ | В | Ю-В | Ю-В | Ю-В | В | Ю-В | Ю | ШТЛ | Ю-В | Ю-В | В | С-В | С-В | С | С-В | В | В | В | С-В | С | направление |
| Влажность, % | 73 | 81 | 82 | 83 | 84 | 82 | 80 | 81 | 81 | 85 | 96 | 94 | 88 | 88 | 84 | 77 | 68 | 58 | 46 | 43 | 43 | 47 | 53 | 63 | 74 | 85 | 89 | 91 | 93 | 93 | 94 | 96 | 96 | 95 | 94 | 91 | 90 | 86 | 71 | 65 | 64 | 62 | 57 | 54 | 53 | 60 | 70 | 86 | 93 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 94 | 92 | 89 | 86 | 73 | 65 | 56 | 50 | 48 | 45 | 43 | 70 | 81 | 91 | 100 | 100 | 82 | 50 | 37 | 71 | 78 | 83 | 91 | 87 | 68 | 49 | 41 | 76 | 89 | 94 | 100 | 100 | 71 | 48 | 47 | 78 | 100 | 100 | 100 | Влажность, % |
| Солнце: восход заход | | 06:01 | | 19:04 | | | 06:02 | 19:01 | | | 06:04 | 18:59 | | | 06:06 | 18:57 | | | 06:07 | 18:54 | | | 06:09 | 18:52 | | | 06:11 | 18:49 | | 06:13 | 18:47 | Солнце: восход заход |
| Луна: восход заход | | 04:49 | | 18:39 | | | 06:14 | 18:50 | | | 07:37 | 19:01 | | | 08:58 | 19:12 | | | 10:19 | 19:25 | | | 11:38 | 19:42 | | | 12:55 | 20:05 | | 14:07 | 20:37 | Луна: восход заход |
| фаза | | | | | | | | | фаза |
Развернуть таблицу (Влажность. Солнце, Луна: восход, заход, фаза)
| больше информации о погоде на сайте rp5.ru |
-
-