首页 > 编程语言 >【python-数据分析】pandas时间序列处理

【python-数据分析】pandas时间序列处理

时间:2024-10-12 17:15:31浏览次数:1  
标签:数据分析 utc 01 tz python ts pd data pandas

1. timestamp

1.1 创建timestamp

  1. 自定义timestamp
  • 语法:pd.Timestamp(ts_input,tz,year,month,day,hour,minute,second,microsecond,nanosecond,tzinfo)
  • 代码示例:
import pandas as pd
import pytz

# 当ts_input为字符串时,一般要与tz参数搭配使用
timestamp = pd.Timestamp(ts_input="2023-01-05", tz=pytz.timezone("Asia/Shanghai"))
print(timestamp)  # 2023-01-05 00:00:00+08:00
import pandas as pd

# 当ts_input为数值型时,一般要与unit参数搭配使用
timestamp = pd.Timestamp(ts_input=1672909342.246457, unit="s")
print(timestamp)  # 2023-01-05 09:02:22.246457100
import pandas as pd

# 当不传ts_input时,一般要指定year,month,day,hour,minute,second等参数
import pandas as pd

timestamp = pd.Timestamp(year=2023,month=1,day=5,hour=17,minute=8,second=34)
print(timestamp)  # 2023-01-05 17:08:34
  1. 获取当前时间戳
print(pd.Timestamp.now())  # 2023-01-05 17:48:56.629418
print(pd.Timestamp.utcnow())  # 2023-01-05 09:48:56.629418+00:00

1.2 timestamp的常用方法及属性

1.2.1 timestamp常用方法

  • ts.tz_localize(tz)
    功能:将naive时区的timestamp本地化其他时区
    参数:tz: 时区标识符
ts = pd.Timestamp("2022-01-06")
print(ts.tz)  # None
ts = ts.tz_localize("Asia/Shanghai")  # 本地化为北京时间
print(ts)  # 2022-01-06 00:00:00+08:00
print(ts.value)  # 1641398400000000000,纳秒级时间戳

1.2.2 timestamp常用属性

  • ts.value(查看纳秒级整型时间戳)
ts = pd.Timestamp("2022-01-06")
print(ts.value)  # 1641398400000000000,纳秒级时间戳

1.3 时区及时区转换

1.3.1 时区

在python中时区信息可以在第三方库pytz中进行查看

(1)查看时区

pytz包中可以使用all_timezones和common_timezones这两个属性来查看有哪些时区。

import pytz
print(len(pytz.all_timezones))  # 595
print(pytz.all_timezones[:5])  # ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara']
import pytz
print(len(pytz.common_timezones))  # 437
print(pytz.common_timezones[:5])  # ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara']

(2)获取时区对象

pytz包中可以使用pytz.timezone(zone)方法来获取时区对象,zone为时区标识符,如中国上海的时区标识符为"Asia/Shanghai"

import pytz
tz = pytz.timezone('Asia/Shanghai')
tz  # <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

1.3.2 时区转换

(1) utc时区转其他时区(两种方式)
  1. timestamp.astimezone(tz=None) -> Timestamp
  • 代码示例
import pandas as pd

utc_ts = pd.Timestamp("2022-01-05 11:45:14",tz="utc")
print(utc_ts)  # 2022-01-05 19:45:14+00:00
beijing_ts = utc_ts.astimezone(tz="Asia/Shanghai")
print(beijing_ts)  # 2022-01-05 19:45:14+08:00
  1. timestamp.tz_convert(tz=None) -> Timestamp
  • 代码示例
import pandas as pd

utc_ts = pd.Timestamp("2022-01-05 11:45:14",tz="utc")
print(utc_ts)  # 2022-01-05 19:45:14+00:00
beijing_ts = utc_ts.tz_convert(tz="Asia/Shanghai")
print(beijing_ts)  # 2022-01-05 19:45:14+08:00
(2) 其他时区转utc时区(同时支持所有时区互转)
  1. pd.DataFrame.tz_localize(tz, axis=0, level=None, copy=True, ambiguous='raise’, nonexistent='raise') -> Series | DataFraem
  • 参数介绍:
    tz: 字符串或pytz.timezone对象
    axis: 定位轴
    level: 如果轴为MultiIndex,则定位特定级别。否则必须为None
    copy: 同时复制基础数据
    ambiguous: 当时钟由于DST而向后移动时,可能会产生不明确的时间
    nonexistent: 在特定时区中不存在不存在的时间,在该特定时区中由于DST而使时钟向前移动
  • 代码示例
    模拟一组时序数据,注意该数据中的时间我们认为是北京时间。我们的目标是把这个时间转成utc时间,并生成时间戳。
import pandas as pd
import numpy as np

grade = np.random.uniform(52,100,200).astype(np.int64)
exam_dates = pd.date_range("2023-01-01", periods=200, freq="H")  # 北京时间
data = pd.DataFrame(data={"grade":grade})
data["date"] = exam_dates
data.set_index("date",inplace=True)

output:
image.png

需要特别注意的一点是:pandas中的时间序列(实质上是Timestamp对象)从时区上来讲有两种,第一种是naive时区的时间序列,即没有时区,时间序列默认的就是这种类型。另一种是time-zone aware类型,即有时区意识的时间序列,这种时间序列(时间戳)对象中保存了一个纳秒级的UTC时间戳,其值在时区转换过程中是不发生改变的。用ts.tz方法可以查看时间序列的时区,用ts.value可以查看时间序列对应的纳秒级时间戳:

print(data.index.tz)  # None,默认没有时区

因此,我们如果想要将这个时间序列转到其他时区,就必须先确定它自己是哪个时区。假设我们认为这个时间序列是北京时间,那我们就必须先赋予给时间序列一个时区信息,即将该时间序列本地化到北京时区。可以使用ts.localize(tz="Asia/Shanghai")方法。

data_bj = data.localize("Asia/Shanghai")
print(data_bj.index.tz)  # Asia/Shanghai
print(data_bj)

output:

image.png
现在该时间序列就有了时区信息,这样我们就可以将它转到另一个时区,可以使用ts.tz_convert(tz="utc")方法。

data_utc = data_bj.tz_convert(tz="utc")
print(data_utc.index.tz)
data_utc

output:
image.png
这样就成功的将北京时间转成utc时间了。但是从上边结果中可以看到,我们转换过来的时间戳是time zone-aware类型的,有'+00:00'的字样。要去掉这个字样,需要将time zone-aware再转为naive类型。

data_utc_naive = data_utc.tz_convert(None)
data_utc_naive

output:
image.png

如果我们需要进一步将date转换为数值型的时间戳,可以通过以下两种方式实现:
(1) 通过时间戳定义,用当前时间减去时间戳计算起点"1970-01-01"

data_utc_naive["dtime1"] = (data_utc_naive.index - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')  # utc时间转毫秒级时间戳
data_utc_naive

output:
image.png

(2) Series的values有一个视图函数view(dtype),我们可以使用该方法去查看Timestamp对象的数值型形式

# 由于视图函数转换过来的时间戳是纳秒级的,我们需要自己去除以一个进制转成我们需要的精度。
# 秒级以下的时间换算关系如下:1s=1000ms=1000us=1000ns
data_utc_naive["dtime2"] = data_utc_naive.index.values.view(dtype=np.int64) // 1000_000
data_utc_naive

output:
image.png

标签:数据分析,utc,01,tz,python,ts,pd,data,pandas
From: https://www.cnblogs.com/berlin-fly/p/18460905

相关文章

  • 【python-日期和时间处理】datetime模块基本使用
    1.获取datetime对象获取当前datetime对象方法:datetime.now(cls,tz=None)->datetime参数说明:tz:时区信息,不传该参数时,默认使用当地时区示例代码:now=datetime.now()print(now)#2023-01-0509:38:43.084062print(type(now))#datetime.datetime如果需......
  • 【python-数据分析】pandas数据提取
    importpandasaspd1.直接索引df=pd.DataFrame({'AdmissionDate':['2021-01-25','2021-01-22','2021-01-20','2021-01-18','2021-01-17','2021-01-17','2021-01-2......
  • 【python日期和时间处理】time模块基本使用
    1.time模块中三种时间格式时间戳time模块获取各种精度的时间戳importtimetimestamp=time.time()timestamp_s=int(time.time())#s精度timestamp_ms=int(time.time()*1000)#ms精度timestamp_us=int(time.time()*1000_000)#μs精度timestamp_ns=t......
  • pandas数据统一绘图风格配置
    在使用pandas的时候,经常会用到Dataframe或者Series的plot方法,该方法底层实际上调的还是matplotlib.pyplot的plot方法。因此,通过对pyplot模块的绘图全局参数设置是可以在pandas中奏效的。importpandasaspdimportmatplotlib.pyplotaspltimportwarningswarnings.filterwa......
  • python __new__和__init__的区别
    简介__new__和__init__都是Python中的特殊方法,它们在对象生命周期中起到不同的作用。用法1、__new__方法:__new__是一个静态方法,用于创建一个新的对象实例。当你调用一个类时,__new__方法是第一个被调用的方法。它的主要任务是分配内存空间,并返回一个新创建的对象实例。通常情况......
  • python 实现工厂类方法
    #工厂类方法1,这些类的实例方法名相同classFruit(object):def__init__(self):passdefprint_color(self):pass#工厂类方法2classApple(Fruit):def__init__(self):passdefprint_color(self):print("applei......
  • 一文了解Python反射机制(很详细)
    https://blog.csdn.net/weixin_40025666/article/details/134456717 https://www.cnblogs.com/mengdie1978/p/17425581.html 一、反射的概念python的反射机制,核心就是利用字符串去已存在的模块中找到指定的属性或方法,找到方法后自动执行——基于字符串的事件驱动。二、熟悉......
  • 一文弄懂 Python os.walk(),文件处理和目录遍历
    ......
  • python redis使用教程
    文章目录安装Redispython安装redis库使用Python连接Redis使用Redis实现缓存Redis中的常用缓存操作Redis缓存策略发布与订阅事务安装RedisRedisWindows最新安装教程(2024.10.10)python安装redis库pipinstallredisE:\Redis-x64-3.2.......
  • Python cachetools常用缓存算法汇总
    文章目录cachetools介绍缓存操作设置数据生存时间(TTL)自定义缓存策略缓存装饰器缓存清理cachetools超过缓存数量maxsizecachetools使用示例cachetools介绍cachetools:是一个Python第三方库,提供了多种缓存算法的实现。缓存是一种用于临时存储计算结果的技术,以......