RDpWTeHM

RDpWTeHM 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

RDpWTeHM 关注了用户 · 10月19日

华为云开发者社区 @huaweiyunkaifazheshequ

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算!

关注 245

RDpWTeHM 回答了问题 · 9月25日

解决datetime.replace(tzinfo=pytz.timezone('Asia/Shanghai’) 后时间戳变小

亚洲/上海 or 中华人民共和国(PRC)的 pytz.timezone 和 「北京时间」有 6 分钟偏移。

原因有历史原因,可以搜索到!

所以在处理“北京时间”的时候,需要掌握一定的知识。

以下内容都默认输入的时间(字符串等)都是北京时间,而且不带时区后缀

  1. 使用 Python 的 datetime.datetime(<北京时间>).timestamp() 得到的是正确的时间戳(timestamp);除非你电脑的系统时区不是中国的。
    也就是说,datetime.datetime 没有指定时区的话,得到的 datetime.datetime 实例使用的时区(默认时区)就是 Python 运行环境的时区(一般就是操作系统设定的时区)。
    所以,如果你在中国使用电脑,电脑设定的时区是中国,你创建的 datetime.datetime 实例中的时间是北京时间,那么:
    instance.timestamp() # instance: <datetime.datetime>
    得到的就是正确的时间戳。
  2. 作为一名软件工程师,应当要考虑到自己写的代码不止在一处电脑运行;所以不能绝对保证 Python 的运行环境时区就是中国的(生产环境上,这一点应该有运维保证)。
    那么,对于不含有指定时区的「日期时间」输入,但我们要将这个输入作为【北京时间】处理的时候,就应该多敲几个字符 ensure 得到的 datetime.datetime 实例上的时区信息是 UTC+8:00 的,怎么做到这一点?
    看如下代码:

    >>> import datetime as dt
    >>> import pytz
    >>> pytz.timezone('Asia/Shanghai').localize(
    ... dt.datetime(2020, 9, 25, 18, 12, 23)
    ... ).timestamp() # correct way
    1601028743.0
    >>>
    >>> dt.datetime(2020, 9, 25, 18, 12, 23).replace(
    ... tzinfo=pytz.timezone('Asia/Shanghai')
    ... ).timestamp() # 00:06 offset
    1601028383.0

    这段代码直接 .timestamp() 取了时间戳
    各位也可以去掉 .timestamp() 看出来
    pytz.timezone(<时区>).localize(<datetime.datetime>)

    datetime.datetime.replace(tzinfo=pytz.timezone(<时区>))
    得到的 datetime.datetime 实例结果中,tzinfo 的不同(自己试一下)。

    即,使用 .localize 的方式才是处理【北京时间】的正确方式!

  3. “ensure 得到的 datetime.datetime 实例上的时区信息是 UTC+8:00”
    之所以这么做,是因为这个帖子,原本的问题是得到 Unix timestamp【时间戳】的问题;
    在 Python 中,【过去日期时间】的时间戳使用借由 datetime.datetime 获得是很合理的方式!
    获取时间戳的方式就是
    instance.timestamp() # instance: <datetime.datetime>
    但是这么获取时间戳的时候,python 需要知道这个 datetime.datetime 的 instance 是哪个时区的,才能计算时间戳;默认时区的方式我在 1. 中已经说了,如果没理解请回到 1. 点再看一下。
    但是如果我们考虑默认时区不是 UTC+8:00 的话,那么从 datetime.datetime 实例计算时间戳就会有问题;所以我们可以通过 2. 中的两种方式(.replace, .localize) 来得到含有【中国时区】(tzinfo)的 datetime.datetime 实例,然后由这个实例计算时间戳就是正确的了。
    而因为历史原因,所以 .replace 的解决方案会有 6 分钟的 offset,所以,实际上我们处理【北京时间】的正确方式应当是 .localize 的方式。

最后,即使不是求【时间戳】,我们可能需要处理一个【日期时间】字符串为 Python 的 datetime.datetime 实例,那么也应该使用 .localize 为其添加上 tzinfo 信息(UTC+8:00)


除了 pytz 还有其它库可以处理时区;这里不再做展开。

关注 2 回答 2

RDpWTeHM 赞了回答 · 9月25日

解决datetime.replace(tzinfo=pytz.timezone('Asia/Shanghai’) 后时间戳变小

同一时刻,差整360秒
image.png

这个问题,参看
https://blog.csdn.net/starrain00/article/details/18323807


update

其实有更简单的方法,就是使用datautil库

from dateutil import tz
from datetime import datetime

cntzinfo = tz.gettz('Asina/Shanghai')
now = datetime.now()
now_cn = now.replace(tzinfo=cntzinfo)

关注 2 回答 2

RDpWTeHM 提出了问题 · 9月25日

解决datetime.replace(tzinfo=pytz.timezone('Asia/Shanghai’) 后时间戳变小

【现象描述】

python 的 datetime replace timezone 为 ‘Asia/Shanghai' 和 ’PRC‘,然后取得的时间戳不正确。

print(datetime.now().replace(tzinfo=pytz.timezone('PRC')).timestamp())
print(datetime.now().replace(tzinfo=pytz.timezone('Asia/Shanghai')).timestamp())
print(datetime.now().timestamp())

前两个值一致;比第三个值小了几百秒;

【正确性】

第三个值是正确的。

【问题】

  1. 为什么?
  2. <font color="red">如果系统环境时区不是 UTC+8 的话,而输入的“日期时间字符串”是北京时间,那么怎么求正确的时间戳???</font>

关注 2 回答 2

RDpWTeHM 赞了问题 · 9月25日

为什么没有 Asia/BeiJing 时区 ..?

众所周知常用的程序语言支持的时区属于中国的有六个 ...

Asia/Chongqing
Asia/Shanghai
Asia/Urumqi
Asia/Macao
Asia/Hong_Kong
Asia/Taipei

我的问题是 ... 为什么是这六个 ..? 最初是因为什么定了这六个城市 ..?

关注 1 回答 3

RDpWTeHM 赞了回答 · 9月24日

【think python】判断一组 `key: str` 中是否存在一个 key `in` a_string?

for k in mapping:
    for i in range(len(data)):
        if k in data[i]:
            data[i] = k

这种写法未必效率低。提供另一种使用正则的思路吧

import re
pattern = re.compile('|'.join(['({})'.format(i) for i in mapping]))

for i in range(len(data)):
    search_result = re.search(pattern, data[i])
    if search_result:
        data[i] = search_result.group()

关注 3 回答 2

RDpWTeHM 关注了专栏 · 9月24日

阿里云栖号

汇集阿里技术精粹-yq.aliyun.com

关注 11803

RDpWTeHM 关注了用户 · 9月24日

CDA数据分析师 @cdac_da

更多精彩内容和专业资讯,可前往https://www.cda.cn/?seo
CDA数据分析师,力争为中国培养更多优秀的数据科学和人工智能领域的优秀人才!
分享数据科学领域的原创文章和行业干货,还有时代热点、人生感悟以及职场点滴,希望你可以阅有所获,学有所得!

CDA微信公众号:CDA数据分析师(ID:cdacdacda)
人工智能服务号:AIU人工智能(ID:ai_cda)
CDA微信小程序:CDA数据分析培训

关注 12

RDpWTeHM 关注了问题 · 9月24日

Python 处理亿级数据量有什么方案?

最近遇到一个问题,要把2亿多的数据插入到 ES 中。

现在的方案是:生成器分段读取文本内容,再对每行内容进行处理,放入到一个列表

ES 方面是循环这个列表,每次取 500 条批量插入到 ES 中
以上方案速度巨慢,跑了一两个小时才1900万,不到2000万,请问这种情况有什么好的方案?

关注 5 回答 1

RDpWTeHM 提出了问题 · 9月23日

【think python】判断一组 `key: str` 中是否存在一个 key `in` a_string?

#think-python#

判断一组 key: str 中是否存在一个 key in a_string?是否有更好的办法?

【需求】

判断「一组」key 中,是否存在一个 key 在(in) string 中?

【当前实现】

mapping = {'合租': '合租',
           '整租': '整租', }

data = [
    '合租(4室1厅2卫)',
    '合租(2室1厅1卫)',
    '整租(3室1厅)',
    '整租(2室1厅1卫)',
]


def reclassify(s: str):
    for key in mapping:
        if key in s:
            return mapping[key]
    return s

for i in range(len(data)):
    data[i] = reclassify(data[i])

【问题】

主要是 line 13~line 16 有更好的写法吗?

总感觉效率有点低(时间复杂度略高)

关注 3 回答 2

认证与成就

  • 获得 7 次点赞
  • 获得 4 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 4 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-10-27
个人主页被 245 人浏览