Merge branch 'dingsu/shadell2' into TencentServer2

This commit is contained in:
DingZQ
2025-03-09 15:16:02 +08:00
3 changed files with 49 additions and 44 deletions

View File

@@ -1465,11 +1465,8 @@ def query_SCADA_data_by_device_ID_and_date(query_ids_list: List[str], query_date
:return:
"""
start_time, end_time = time_api.parse_beijing_date_range(query_date)
start_time_str = time_api.format_beijing_time(start_time)
end_time_str = time_api.format_beijing_time(end_time)
print(f"start_time_str: {start_time_str}, end_time_str: {end_time_str}")
return query_SCADA_data_by_device_ID_and_time_range(query_ids_list, start_time_str, end_time_str, bucket, client)
return query_SCADA_data_by_device_ID_and_time_range(query_ids_list, str(start_time), str(end_time), bucket, client)
# 2025/02/01

View File

@@ -21,11 +21,13 @@ def install():
'influxdb_client',
'numpy',
'fastapi',
"msgpack",
'schedule',
'pandas',
'openpyxl',
'redis',
'pydantic',
'python-dateutil',
'starlette',
'requests',
'uvicorn',

View File

@@ -1,4 +1,5 @@
import datetime
from datetime import datetime, timezone, timedelta
from dateutil import parser, tz
'''
2025-02-09T15:45:00+00:00 采用的是 ISO 8601 国际标准日期时间格式,具体特点如下:
@@ -12,86 +13,91 @@ import datetime
2025-02-09T15:45:00+08:00
'''
BG_TZ = tz.gettz('Asia/Shanghai')
UTC_TZ = tz.gettz('UTC')
def parse_utc_time(query_time: str) -> datetime.datetime:
def parse_utc_time(query_time: str) -> datetime:
'''
将一个北京时间的时间点转换成utc
接受 任意格式的字符串,如果解析出来不带时区,则用 replace 添加 +00:00 时区
如果解析出来已经有时区,则用 astimezone 转换成UTC时间
'''
return datetime.datetime.fromisoformat(query_time)
# 解析时间字符串
dt: datetime = parser.parse(query_time)
if dt.tzinfo is None:
dt = dt.replace(tzinfo=UTC_TZ)
else:
dt = dt.astimezone(UTC_TZ)
return dt
def parse_beijing_time(query_time: str) -> datetime.datetime:
def parse_beijing_time(query_time: str) -> datetime:
'''
将一个 2025-02-09T15:45:00+00:00 的北京时间时间点
接受 任意格式的字符串,如果解析出来不带时区,则用 replace 添加 +08:00 时区
如果解析出来已经有时区,则用 astimezone 转换成北京时间
也就是任意合法的时间字符串,最后都解析成 北京 时间
'''
try:
return datetime.datetime.strptime(query_time, "%Y-%m-%dT%H:%M%z")
except Exception as e:
print(f"Error parsing Beijing time: {e}")
return datetime.datetime.strptime(query_time, "%Y-%m-%dT%H:%M:%S%z")
# 解析时间字符串
dt: datetime = parser.parse(query_time)
if dt.tzinfo is None:
dt = dt.replace(tzinfo=BG_TZ)
else:
dt = dt.astimezone(tz=BG_TZ)
def to_utc_time(dt: datetime.datetime) -> datetime.datetime:
return dt
def to_utc_time(dt: datetime) -> datetime:
'''
将一个北京时间的时间点转换成utc
'''
utc_time = dt.astimezone(datetime.timezone.utc)
utc_time = dt.astimezone(UTC_TZ)
return utc_time
def to_beijing_time(dt: datetime.datetime) -> datetime.datetime:
def to_beijing_time(dt: datetime) -> datetime:
'''
将一个 utc 的时间点,转换成北京时间
'''
beijing_time = dt.astimezone(datetime.timezone(datetime.timedelta(hours=8)))
beijing_time = dt.astimezone(tz=BG_TZ)
return beijing_time
def parse_date(query_time: str) -> datetime.date:
'''
将一个日期字符串,转换成日期
日期字符串格式YYYY-MM-DD
'''
return datetime.datetime.fromisoformat(query_time).date()
def to_time_range(dt: datetime, delta: float) -> tuple[datetime.datetime, datetime.datetime]:
def to_time_range(dt: datetime, delta: float) -> tuple[datetime, datetime]:
'''
将一个时间点,转换成 start/end 时间段
有些查询按照一个时间点查不到,用时间段保证能成功
delta 单位是秒
'''
start_time = dt - datetime.timedelta(seconds=delta)
end_time = dt + datetime.timedelta(seconds=delta)
start_time = dt - timedelta(seconds=delta)
end_time = dt + timedelta(seconds=delta)
return (start_time, end_time)
def parse_beijing_date_range(query_time: str) -> tuple[datetime.datetime, datetime.datetime]:
def parse_beijing_date_range(query_date: str) -> tuple[datetime, datetime]:
'''
将一个日期字符串,转换成 start/end 时间段
将一个日期字符串,转换成 start/end 时间段,传进来的日期被认为是北京时间
日期字符串格式YYYY-MM-DD
'''
start_time = datetime.datetime.fromisoformat(query_time)
end_time = start_time + datetime.timedelta(days=1)
start_time = to_beijing_time(start_time)
end_time = to_beijing_time(end_time)
start_time = parse_beijing_time(query_date)
end_time = start_time + timedelta(days=1)
return (start_time, end_time)
def format_beijing_time(dt: datetime.datetime) -> str:
'''
将一个北京时间的时间点,转换成字符串
格式YYYY-MM-DDTHH:MM:SS+08:00
'''
return dt.strftime('%Y-%m-%dT%H:%M:%S%z')
def get_day_start(dt: datetime.date) -> datetime.datetime:
def get_day_start(dt: datetime.date) -> datetime:
'''
获取 某一天的 00:00:00
这一天可以是北京时间,也可以是 utc 时间
'''
return dt.replace(hour=0, minute=0, second=0, microsecond=0)
def get_day_end(dt: datetime.date) -> datetime.datetime:
def get_day_end(dt: datetime.date) -> datetime:
'''
获取 某一天的 23:59:59
这一天可以是北京时间,也可以是 utc 时间