8.Python中使用Pandas对时间的操作——创建时间变量、转化为时间对象、使用时间索引、时间序列的使用方式
•
编程语言
1.Pandas日期时间变量
Timestamp与Period创建时间对象
import pandas as pd
from datetime import datetime
# 创建日期时间变量Timestamp
print(pd.Timestamp(datetime(2032,1,1))) # 自动补充时分秒
print(pd.Timestamp(datetime(2032,1,1,3,4,5)))
print(pd.Timestamp(2032,1,2)) # 效果与上面的一样
print(pd.Timestamp(2032,1,2,3,4,5))
print(pd.Timestamp('2032-01-02'))
print(pd.Timestamp('2032/01/02')) # 用 / 或者 - 划分年月日,用:划分时分秒
print(pd.Timestamp('2032-01-02 01:02:03'))
# Peroid 被看作是化简后的Timestamp对象
pd.Period('2032-01') # 后面代表精确值 M月份 Y年.......
pd.Period('2032-09',freq='D')

2.Pandas时间转换
在我们python数据分析的过程中,我们经常需要对时间日期进行转换成时间对象。
pd.to_datetime(
arg :需要转换为 Timestamp 类的数值
Integer, float, string, datetime, list, tuple, 1-d array,Series,
errors = ‘raise' : (‘ ignore' , ‘raise' , 'coerce' )
'raise ' 抛出错误
'coerce' 设定为 NaT
'ignore' 返回原值短日期的解释方式:类似 '10/11/12"这样的数据如何解释
dayfirst = ‘False' : 数值是否 day 在前
yearfirst = 'False':数值是否 year 在前,该设定优先
box = True :是否返回为 DatetimeIndex, False 时返回ndarray 数组
format = None :需要转换的字符串格式设定)
pd.to_datetime(datetime(2032, 1, 2, 3, 4, 5))
pd.to_datetime('2032-01-02 3:4:5')
pd.to_datetime(['2032/01/02' , '2032.01.03'])
pd.to_datetime(df[ 'date' ], format = '%Y-%m-
%d %H:%M')
import pandas as pd
df = pd.read_excel('date_test.xlsx')
pd.options.display.max_rows = 5
# 查看需要转化的时间数据
print('查看需要转化的时间数据')
print(df['date'])
print(type(df['date'][0]))
print(type(df['date']))
# 方法1:使用Timestamp转化单个数据
print('方法1:使用Timestamp转化单个数据')
print(pd.Timestamp(df['date'][0]))
print(type(pd.Timestamp(df['date'][0])))
# 方法2:使用Timestamp转化全部数据
print('方法2:使用Timestamp转化全部数据')
print(df['date'].apply(pd.Timestamp))
print(type(df['date']))
# 方法3:使用to_datetime()转化
# 测试用法
from datetime import datetime
# 可以直接传入;可以传入字符串;可以传入列表
pd.to_datetime(datetime(2030,3,4))
pd.to_datetime(datetime(2030,3,4,4,5,6))
pd.to_datetime('2031-3-4 4:21:22')
pd.to_datetime(['2031-3-4','2032.3.2','2030/2/1'])
# 转化date的数据
pd.to_datetime(df['date'])

df2 = pd.read_excel('date_test.xlsx',sheet_name='Date')
df2
# 使用to_datetime转化dateframe几列为日期格式
pd.to_datetime(df2[['Year',"Month",'Day','Hour']])

3.Pandas时间索引——使用 DatetimeIndex 类
Datetimeindex 类对象除了拥有 Index 类对象的所有功能外,还针对日期时间的特点有如
下增强:
- 基于日期时间的各个层级做快速索引操作
- 快速提取所需的时间层级
- 按照所指定的时间范围做快速切片
这种建立方式主要是和 reindx 命令配合使用,以快速完成对时间序列中缺失值的填充工作 pd.date_range( start /end = None :日期时间范围的起点/终点,均为类日期时 间格式的字符串/数 据 periods = None :准备生成的总记录数 freq = 'D':生成记录时的时间周期,可以使用字母和数值倍数的 组合,如'5H' name = None :生成的 DatetimeIndex 对象的名称 ) pd.bdate_range( 主要参数和 pd.date_range 几乎完全相同,但默认 freq = 'B' (business daily) 另外附加了几个针对工作日/休息日筛选的参数 )
import pandas as pd
# 1.手动创建DatetimeIndex
index = pd.DatetimeIndex(['2030-1-1','2030-1-2','2030-1-3','2030-1-4','2030-1-5','2030-1-6',
'2030-1-7','2030-1-8','2030-1-9','2030-1-10'])
# 2.自动创建时间索引date_rande() 指定start end 默认是按天进行递增 对比1.多增加一个freq
index2 = pd.date_range('2030-1-1','2030-1-10')
index2
# 3.自动创建时间索引date_rande() 指定start 和 periods(创建几个日期索引)默认是按天进行递增freq
index3 = pd.date_range('2030-1-1',periods=10)
index3
# 4.自动创建时间索引date_rande() 指定start 和 periods(创建几个日期索引) 指定日期单位freq
index4 = pd.date_range('2030-1-1',periods=10,freq='H')
index4
# 5.自动创建时间索引date_rande() 指定start 和 periods(创建几个日期索引) 指定日期单位freq(几倍的最小单位)
index5 = pd.date_range('2030-1-1',periods=10,freq='3H')
index5

# 6.bdate_range() :用法类似 freq默认是B 日
index6 = pd.bdate_range('2030-1-1',periods=10)
index6

# 7.读取文件指定时间索引
df = pd.read_excel('date_test.xlsx',index_col='date')
pd.options.display.max_rows=5
df

# 8.日期索引优势:索引过滤、切片 df['2035'] df['2035-1'] df['2025':'2027'] df['2026-4':'2029-5']


4.Pandas时间序列的使用
序列的分组汇总
DatetimeIndex 对象可直接引用的属性(这也是我们为什么要把时间设置成Datetime格式的优势):

import pandas as pd
df = pd.read_excel('date_test.xlsx', index_col='date') # 设置时间为索引
# 获取月份
df.index.month
# 获取年
df.index.year

直接使用 groupby 方法进行汇总
# 直接使用 groupby 方法进行汇总 df.groupby(df.index.year).max()

resample( )
使用上比 groupby 更简单(输入更简洁) 可以将日期格式Datetime数值和汇总单位进行组合,实现更复杂的汇总计算

# 使用resample 实现更复杂的对时间格式的分组
df.resample('2Y').mean() # 求2年一组的平均值
# 分组为3天:求3天一组中的最小值
df.resample('3D').min()

时间缺失值的处理
对于缺失值,不仅仅时Nan,数据中的没有按照规律给出的时间也算是缺失值
时间序列要求记录的时间点连贯无缺失,因此需要:
- 首先建立针对整个时间范围的完整序列框架
- 随后针对无数据的时间点进行缺失值处理
序列数值平移
df.shift(
periods = 1: 希望移动的周期数
freq :时间频度字符串
axis =0
)
# 处理时间缺失值方法:# 第一步:建立完整的数据列表index = pd.date_range('2025-01-01',"2037-12-31")# 第二步:查看索引是否有重复print(df.index.duplicated())# 第三步:获取不重复的索引数据(作为查看的一种方式)# df2 = df[~df.index.duplicated()].reindex()# 第四步:填充缺失值df2 = df[~df.index.duplicated()].reindex(index, method='ffill') # 向上填充# 第五步:shift()平移df2.shift(-2) # -2向上平移2个位置
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://www.net2asp.com/00855b22ef.html
