博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python学习笔记

Posted on 2023-01-05 19:07  Sxcan  阅读(10)  评论(0编辑  收藏  举报
1.计算列表中符合条件的字典元素的个数
my_list=[{'is_pass':True},{'is_pass':True},{'is_pass':False},{'is_pass':False},{'is_pass':True},{'is_pass':True}]
# 方法一:
from collections import Counter
my_list=[{'is_pass':True},{'is_pass':True},{'is_pass':False},{'is_pass':False},{'is_pass':True},{'is_pass':True}]    
print(Counter(tok['is_pass'] for tok in my_list))
# 方法二:
true_flag = sum([1 for i in my_list if i["is_pass"])
false_flag = len(my_list) - true_flag
2.insepectdb生成表名长度超过30的model,在查询中总是报错不存在

原因和解决方案如下,引自官方说明:

Oracle 的表名引用

为了满足 Oracle 对表名的 30 个字符的限制,并符合 Oracle 数据库的惯例,Django 可能会缩短表名,并将其全部变成大写。为了防止这样的转变,使用带引号的名称作为 db_table 的值:

db_table = '"name_left_in_lowercase"'
这样的引号也可以用在 Django 的其他支持的数据库后端,但是除了 Oracle,引号没有任何作用。更多细节请参见 Oracle 注解。

3.django查询数据,总是多一笔不符合条件的数据

原因:条件中使用了lt比较数值大小,数据库中栏位属性为varchar。
解决:

from django.db.models.functions import Cast
from django.db.models import FloatField
# 把字段转为float类型,再使用转换后的字段进行比较
annotate(column_num=Cast('column', FloatField())).filter(column_num__lt=30)

ChatGPT回答:

当您在数据库中将数字存储为 VARCHAR2 类型时,进行大小比较时可能会出现问题。因为在这种情况下,数字将被视为字符串,因此比较是基于字符串排序的,而不是数字排序。这可能导致比较的结果不符合预期。
4.python操作elasticsearch遇到的时区问题

在使用python读取es数据时,发现获取不到数据,定位到是日期条件有问题,查阅资料得知es在存储数据时,会自动把时间改为UTC时间,比本地时区(ShangHai)少8小时。而在Kibana中查询时看到的时区却和本地时区一致,是因为Kibana 使用了浏览器的时区时间,在Kibana的discover上查询时,点击右上角的Inspect-Request可以看到你查询的条件对应的Elasticsearch查询语句中时间条件是比本地时区少8小时的,所以导致Kibana上能看到数据,但是python却取不到数据。同样的,当你在Kibana上手动编写语句去查询,也是查不到数据。
解决办法:

from datetime import datetime, timedelta
today = datetime.utcnow().date()
start_date = datetime(today.year, today.month, today.day, 0, 0, 0)
end_date = start_date + timedelta(days=1)

start_date_str = start_date.strftime("%Y-%m-%d %H:%M:%S")
end_date_str = end_date.strftime("%Y-%m-%d %H:%M:%S")
{
    "range": {
        "@timestamp": {
            "gte": start_date_str,
            "lt": end_date_str,
            "format": "yyyy-MM-dd HH:mm:ss",
            "time_zone": "Asia/Shanghai"  # 将es的国际时间改为本地时间
        }
    }
},

在上面的解决方案中,如果你获取的结果展示时需要用到@timestamp,记得给它转成本地时间,因为它仍是UTC时间,我们只是在查询时做了条件更改,结果是不变的。

from datetime import datetime
# 将 @timestamp 转换为本地时区的 datetime 对象
log_time_utc = datetime.fromisoformat(hit['_source']['@timestamp'].replace('Z', '+00:00'))
log_time_local = log_time_utc.astimezone(local_tz)