文章目录

  • 1 时区处理
  • 2 本地化和转换
    • 方式一
    • 方式二
  • 3 操作时区意识型Timestamp对象
  • 4 不同时区之间的运算

1 时区处理

Python中时区信息来自第三方库pytz

import pytz# 常用的时区列表(440个)
pytz.common_timezones[-5:]
# ['US/Eastern', 'US/Hawaii', 'US/Mountain', 'US/Pacific', 'UTC']# 常用的时区集合
pytz.common_timezones_set
#  {'Asia/Shanghai', 'Asia/Urumqi', ...}# 1.pytz查询某个的时区:可以根据国家代码查找这个国家的所有时区
pytz.country_timezones('cn') # ['Asia/Shanghai', 'Asia/Urumqi']# 2.pytz创建时区对象
# 根据上面得到的时区信息,就可以创建指定的时区对象。
# 比如创建上海时区对象:
tz=pytz.timezone('Asia/Shanghai')# 3.得到某个时区的时间
# 然后在创建时间对象时进行指定上面时区,就可以得到指定时区的日期时间:import datetime# 有两种时间类型:naive和aware
# 第一种:naive,没有表明时区的时间
datetime.datetime.now()
# datetime.datetime(2021, 1, 28, 17, 18, 56, 324868)# 第二种:aware,有时区的时间
datetime.datetime.now(tz)
# datetime.datetime(2021, 1, 28, 17, 19, 6, 804947, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

可以发现aware类型时间多了tzinfo标识时区
而因为我们获取当前的时候没有传入时区,为naive类型
所以与有些aware时间操作会发生异常

其实解决方法也很简单,将naive转化为aware类型就好了
怎样转化呢?我找到了这几种方式:

datetime.datetime.now()
# datetime.datetime(2021, 1, 28, 17, 29, 49, 620625)# 方式一
datetime.datetime.now().replace(tzinfo=pytz.utc)
# datetime.datetime(2021, 1, 28, 17, 30, 0, 718485, tzinfo=<UTC>)# 方式二
datetime.datetime.now(pytz.utc)
# datetime.datetime(2021, 1, 28, 9, 30, 12, 161834, tzinfo=<UTC>)# 方式三
pytz.utc.localize(datetime.datetime.now())
# datetime.datetime(2021, 1, 28, 17, 30, 38, 100480, tzinfo=<UTC>)

2 本地化和转换

默认情况下,pandas中的时间序列是naive时区。从naive到本地化通过tz_localize实现:

方式一

import pandas as pd
import numpy as np# 方式一
rng=pd.date_range('3/9/2012 9:30',periods=6,freq='D')
DatetimeIndex(['2012-03-09 09:30:00', '2012-03-10 09:30:00','2012-03-11 09:30:00', '2012-03-12 09:30:00','2012-03-13 09:30:00', '2012-03-14 09:30:00'],dtype='datetime64[ns]', freq='D')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
2012-03-09 09:30:00   -1.206248
2012-03-10 09:30:00   -1.132678
2012-03-11 09:30:00    1.259751
2012-03-12 09:30:00    1.275133
2012-03-13 09:30:00   -1.588024
2012-03-14 09:30:00   -1.083190
Freq: D, dtype: float64
ts_utc=ts.tz_localize('UTC')
2012-03-09 09:30:00+00:00   -1.206248
2012-03-10 09:30:00+00:00   -1.132678
2012-03-11 09:30:00+00:00    1.259751
2012-03-12 09:30:00+00:00    1.275133
2012-03-13 09:30:00+00:00   -1.588024
2012-03-14 09:30:00+00:00   -1.083190
Freq: D, dtype: float64
ts_utc.index
DatetimeIndex(['2012-03-09 09:30:00+00:00', '2012-03-10 09:30:00+00:00','2012-03-11 09:30:00+00:00', '2012-03-12 09:30:00+00:00','2012-03-13 09:30:00+00:00', '2012-03-14 09:30:00+00:00'],dtype='datetime64[ns, UTC]', freq='D')

一旦时间序列被本地化到某个特定时区,就可以用tz_convert将其转换到别的时区了:

ts_utc.tz_convert('US/Eastern')
2012-03-09 04:30:00-05:00   -1.206248
2012-03-10 04:30:00-05:00   -1.132678
2012-03-11 05:30:00-04:00    1.259751
2012-03-12 05:30:00-04:00    1.275133
2012-03-13 05:30:00-04:00   -1.588024
2012-03-14 05:30:00-04:00   -1.083190
Freq: D, dtype: float64

对于上面这种序列,可以先本地化到US/Eastern,然后转化成UTC或柏林时间:

ts_Eastern=ts.tz_localize('US/Eastern')
ts_Eastern.tz_convert('UTC')
2012-03-09 14:30:00+00:00   -1.206248
2012-03-10 14:30:00+00:00   -1.132678
2012-03-11 13:30:00+00:00    1.259751
2012-03-12 13:30:00+00:00    1.275133
2012-03-13 13:30:00+00:00   -1.588024
2012-03-14 13:30:00+00:00   -1.083190
Freq: D, dtype: float64
ts_Eastern.tz_convert('Europe/Berlin')
2012-03-09 15:30:00+01:00   -1.206248
2012-03-10 15:30:00+01:00   -1.132678
2012-03-11 14:30:00+01:00    1.259751
2012-03-12 14:30:00+01:00    1.275133
2012-03-13 14:30:00+01:00   -1.588024
2012-03-14 14:30:00+01:00   -1.083190
Freq: D, dtype: float64

方式二

# 方式二
rng=pd.date_range('3/9/2012 9:30',periods=6,freq='D',tz='UTC')
DatetimeIndex(['2012-03-09 09:30:00+00:00', '2012-03-10 09:30:00+00:00','2012-03-11 09:30:00+00:00', '2012-03-12 09:30:00+00:00','2012-03-13 09:30:00+00:00', '2012-03-14 09:30:00+00:00'],dtype='datetime64[ns, UTC]', freq='D')

3 操作时区意识型Timestamp对象

Timestamp对象也能从naive本地化为aware,并从一个时区转换到另一个时区:

stamp=pd.Timestamp('2011-03-12 04:00')
# Timestamp('2011-03-12 04:00:00')stamp_utc=stamp.tz_localize('utc')
# Timestamp('2011-03-12 04:00:00+0000', tz='UTC')stamp_utc.tz_convert('US/Eastern')
# Timestamp('2011-03-11 23:00:00-0500', tz='US/Eastern')

创建Timestamp对象时,还可以传入一个时区信息:

stamp_sh=pd.Timestamp('2011-03-12 04:00',tz='Asia/Shanghai')
# Timestamp('2011-03-12 04:00:00+0800', tz='Asia/Shanghai')

aware时间类型的Timestamp对象在内部保存了一个UTC时间戳。这个UTC值在时区转换过程中是不会发生变化的:

stamp_utc.value
# 1299902400000000000
stamp_utc.tz_convert('US/Eastern').value
# 1299902400000000000

4 不同时区之间的运算

如果两个时间序列的时区不同,将它们合并之后最后结果会是UTC。

由于时间戳其实是用UTC存储的,所以这是一个简单的运算,并不用发生任何转换:

rng=pd.date_range('3/7/2012 9:30',periods=10,freq='B')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
2012-03-07 09:30:00   -0.529881
2012-03-08 09:30:00   -0.186080
2012-03-09 09:30:00   -1.697626
2012-03-12 09:30:00   -1.698966
2012-03-13 09:30:00   -0.953260
2012-03-14 09:30:00   -1.854349
2012-03-15 09:30:00   -0.326545
2012-03-16 09:30:00    2.185325
2012-03-19 09:30:00   -0.731005
2012-03-20 09:30:00   -1.104334
Freq: B, dtype: float64
ts1=ts[:7].tz_localize('Asia/Shanghai')
ts2=ts1[2:].tz_convert('US/Eastern')
res=ts1+ts2
res.index
DatetimeIndex(['2012-03-07 01:30:00+00:00', '2012-03-08 01:30:00+00:00','2012-03-09 01:30:00+00:00', '2012-03-12 01:30:00+00:00','2012-03-13 01:30:00+00:00', '2012-03-14 01:30:00+00:00','2012-03-15 01:30:00+00:00'],dtype='datetime64[ns, UTC]', freq='B')

等价于

ts1.tz_convert('utc')
2012-03-07 01:30:00+00:00   -0.529881
2012-03-08 01:30:00+00:00   -0.186080
2012-03-09 01:30:00+00:00   -1.697626
2012-03-12 01:30:00+00:00   -1.698966
2012-03-13 01:30:00+00:00   -0.953260
2012-03-14 01:30:00+00:00   -1.854349
2012-03-15 01:30:00+00:00   -0.326545
Freq: B, dtype: float64

【Python笔记】Pandas时区处理相关推荐

  1. 轩小陌的Python笔记-Pandas 数据处理

    Pandas 数据处理 一.数据IO操作 pandas IO操作主要是读取和写入有特定格式的文件,如CSV文件.TXT文件: # 本质上pd.read_csv和pd.read_tablepd.read ...

  2. Python numpy+pandas+matplotlib学习笔记

    Python numpy+pandas+matplotlib 本文是根据b站路飞学城Python数据分析全套教程的学习视频整理归纳的学习文档,主要目的是方便自己进行查阅,详细的还得去b站看原视频.另外 ...

  3. Python之Pandas:pandas.read_csv()函数的简介、具体案例、使用方法详细攻略

    Python之Pandas:pandas.read_csv()函数的简介.具体案例.使用方法详细攻略 目录 read_csv()函数的简介 read_csv()函数的简介               ...

  4. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其它内 ...

  5. 【Python】Pandas GroupBy 深度总结

    今天,我们将探讨如何在 Python 的 Pandas 库中创建 GroupBy 对象以及该对象的工作原理.我们将详细了解分组过程的每个步骤,可以将哪些方法应用于 GroupBy 对象上,以及我们可以 ...

  6. 【Python笔记】pyqt5进度条-多线程图像分块处理防止窗体卡顿

    目录 主要功能 环境配置 实现过程 1.设计ui 主界面 弹出框 窗体文件 2.主体实现 打开文件 计算函数 代码附录 title.ui titleok.ui title.py titleok.py ...

  7. Python笔记相关

    Python 2021.9.9 Turtle官方文档 货币兑换 money=input("请输入货币符号($/¥)和金额:") while 1+1==2:if money[0] i ...

  8. 机器学习入门:准备知识笔记(pandas)之一

    参考教学笔记:2021年Python人工智能,13天机器学习入门到精通,精讲+14大案例分析(数据来源参考) pandas的优势  增强图表可读性 便捷的数据处理能力 读取文件方便 封装了Matplo ...

  9. python中成绩分析函数_自学Python笔记:用Python做成绩分析(1)

    有朋友会问,刚学了一周,什么是面向对象都还不清楚就可以写程序?还有Python不是写"爬虫"吗? Python是面向对象的语言,函数.模块.数字.字符串都是对象,并且完全支持继承. ...

  10. python笔记_第三周

    python笔记_第三周 第十天 回调函数 回调函数就是一个被作为参数传递的函数把函数a当做一个值 赋值给函数b的形参, 在调用函数b的时候 在函数体内 适当的实际调用函数a, 这个函数a就是回调函数 ...

最新文章

  1. cocos creator 安卓原生平台环境_竞技对抗小游戏单挑篮球开发历程 | Cocos技术派第12期...
  2. 【爬坑】远程连接 MySQL 失败
  3. 史上最详细的RocketMq 下单支付案例 分享
  4. 双向链表实现电话簿C++代码实现
  5. react --- 按需加载组件
  6. .net Core把一个list集合里面的所有字段的数值汇总
  7. java web框架 django_django——web框架简介
  8. 圣诞节吃饺子时,怎么给女票解释啥是AI?
  9. matlab设置ga算法,matlab遗传算法ga函数
  10. 洛谷 P2437 蜜蜂路线
  11. k8s Deployment
  12. monkey命令常用参数与monkey事件百分比
  13. 【全栈计划 —— 单片机】——Part_01 单片机数字电路基础+C51基础概念
  14. python 微信授权 昵称乱码解决
  15. linux全角半角切换,教您输入法全角和半角怎么切换
  16. 基于微信小程序的电影院订票选座系统设计 毕业设计论文
  17. 测试环境部署——selenium+python
  18. 循环经济下的商业模式
  19. CrackMe 之 006
  20. pwn学习——ret2libc1

热门文章

  1. Shell中的感叹号
  2. Unity中的Character Controller 简介
  3. cisco服务器桌面命令行窗口,WLC调试和显示命令
  4. lol计算机丢失msvcp140,玩英雄联盟提示电脑缺少msvcp140.dll怎么办
  5. BLUES吉他学习笔记001 bluesrv[1-5]
  6. 寒霜朋克计算机丢失,寒霜朋克无法启动运行解决方法 寒霜朋克不能运行怎么办?...
  7. C++实现身份证校验和归属地查询
  8. 行动是最好的告白,钟意社科院杜兰金融管理硕士项目的你不要错过机会
  9. xml 中的 大于号,小于号
  10. 回想那些年我抛弃的技术