【python-数据分析】pandas时间序列处理
1. timestamp
1.1 创建timestamp
- 自定义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
- 获取当前时间戳
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时区转其他时区(两种方式)
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
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时区(同时支持所有时区互转)
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:

需要特别注意的一点是: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:

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

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

如果我们需要进一步将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:

(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:

【python-数据分析】pandas时间序列处理的更多相关文章
- Python数据分析--Pandas知识点(三)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. Python数据分析--Pandas知识点(一) Python数据分析--Pandas知识点(二) 下面将是在知识点一, ...
- Python数据分析--Pandas知识点(二)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. Python数据分析--Pandas知识点(一) 下面将是在知识点一的基础上继续总结. 13. 简单计算 新建一个数据表 ...
- Python数据分析-Pandas(Series与DataFrame)
Pandas介绍: pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. Pandas的主要功能: 1)具备对其功能的数据结构DataFrame.Series 2)集成时间序 ...
- python 数据分析--pandas
接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利用pandas的DataFrames进行统计分析 ...
- Python数据分析Pandas库方法简介
Pandas 入门 Pandas简介 背景:pandas是一个Python包,提供快速,灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观.它旨在成为在Python中进行实际, ...
- Python数据分析 Pandas模块 基础数据结构与简介(一)
pandas 入门 简介 pandas 组成 = 数据面板 + 数据分析工具 poandas 把数组分为3类 一维矩阵:Series 把ndarray强大在可以存储任意数据类型可以专门处理时间数据 二 ...
- Python数据分析 之时间序列基础
1. 时间序列基础 import numpy as np import pandas as pd np.random.seed(12345) import matplotlib.pyplot as p ...
- Python数据分析Pandas库之熊猫(10分钟二)
pandas 10分钟教程(二) 重点发法 分组 groupby('列名') groupby(['列名1','列名2',.........]) 分组的步骤 (Splitting) 按照一些规则将数据分 ...
- Python数据分析Pandas库之熊猫(10分钟一)
pandas熊猫10分钟教程 排序 df.sort_index(axis=0/1,ascending=False/True) df.sort_values(by='列名') import numpy ...
- Python数据分析Pandas库数据结构(一)
pandas数据结构 1.生成一维矩阵模拟数据 import pandas as pdimport numpy as nps = pd.Series([1,2,3,4,np.nan,9,9])s2 = ...
随机推荐
- 2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k。 如果 nums1 数组中的元素 nums1[i] 能被
2025-01-01:优质数对的总数Ⅰ.用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k. 如果 nums1 数组中的元素 nums1[i] 能被 ...
- 开源商业化 Sealos 如何做到月入 160万
去年我写了一篇也是讲开源商业化的文章,当时是月入 30 万,一年过去了,我们整整涨了 5 倍多.本文理论结合实践,比较干货,希望对大家有帮助. 我们的现状,谁在给我们付钱 第一,开发者,我们已经近 2 ...
- Python连接远程设备
import paramiko def content_ssh(): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(parami ...
- C++:随机数生成
C++中生成随机数:需要用到的函数,一个是rand(),该函数只返回一个伪随机数.生成随机数之前必须先调用srand()函数. 生成随机数 #include iostream; #include ct ...
- 埋点-App层丢失率
一.建表语句 create table dws_bhv_habo_measure_lostrate_mb_di( version_flag bigint comment '版本标签 2:web丢失 3 ...
- 如何基于DeepSeek开展AI项目
关注公众号回复1 获取一线.总监.高管<管理秘籍> 书接上文:DeepSeek怎么突然就比肩GPT了? 最近一直在研究DeepSeek,作为应用层的选手,自然不会傻乎乎的想要去了解底层,我 ...
- mybatis之使用Map和模糊查询
使用Map 接口类 package com.yeyue.dao; import com.yeyue.pojo.User; import java.util.List; import java.util ...
- IPTools for .NET:快速查询全球IP信息
IPTools 是一个用于快速查询全球 IP 地址信息的库,支持国内和国际 IP 查询,提供详细的地理位置信息(如国家.省份.城市)以及经纬度等数据. 1. IPTools.China IPTools ...
- 百万架构师第三十九课:RabbitMq:Linux安装RabbitMq|JavaGuide
来源:https://javaguide.net RPM包安装RabbitMQ RabbitMQ的安装非常简单,由于RabbitMQ依赖于Erlang,所以需要先安装Erlang,解决依赖关系后,就可 ...
- 洛谷B3843 [GESP202306 三级] 密码合规 题解
原题传送门 前言 咳咳,由于本人最近在备考GESP三级,所以可能会有很多水的题解.(见谅--见谅--) 由于今天刚刚重新刷了一遍此题,所以记忆犹新.(太菜了!一个测试点都能 WA ) 题目解析 简单的 ...