pandas 时间序列处理

转换为时间对象

	import datetime
	import pandas as pd
	
	date = '20170808'
	
	pd.to_datetime(date)
	
	date = ['2017-6-26', '2017-6-27']  # ok 
	
	# date = ["20170101", "20180101"]  # ok 
	
	# import datetime
	# date = [datetime.datetime(2017, 1, 1), datetime.datetime(2019, 2, 4)]  # ok 
	
	pd.to_datetime(date)
	
	# 将一列数据集中的某一列数据进行转转换 (说明可以传入的是列表或者是 Series 对象)
	# data1 是一个 DataFrame 对象
	# data1["Date"] = pd.to_datetime(data1["Date"])

以datetime为索引的时间序列

	# (1)  直接用 datetime.datetime 对象作为某个 Series 的索引生成一个时间序列 
	# ts 就是一个时间序列,这时候一系列的datetime对象被放在一个DatatimeIndex中,作为ts的索引,其类型也变成了 numpy 中的
	# Timestamp
	dates = [
	    datetime.datetime(2011, 1, 2), datetime.datetime(2011, 1, 5), datetime.datetime(2011, 1, 7),
	    datetime.datetime(2011, 1, 8), datetime.datetime(2011, 1, 10), datetime.datetime(2011, 1, 12)
	]
	ts = pd.Series(np.random.randn(6), index=dates)
	
	ts.index
	
	# (2) 生成一个日期范围作为索引 pd.date_range
	# index = pd.date_range('起始时间','结束时间')
	# index = pd.date_range(start='起始时间',period='持续的时间段')
	# index = pd.date_range(end='结束时间',period='持续的时间段')
	# index = pd.date_range('起始时间','结束时间',freq='BM')
	# freq是指定以某种频率生成(默认为D),具体如下,也可以令其为3D,就是每隔3天生成,或者1D1H等。

以 Period(时间段、时期)对象为索引的时间序列

	# (1) Timestamp转换为Period(时间段、时期):pd.to_period()
	rng = pd.date_range("1/1/2000", periods=3, freq="M")
	
	ts = pd.Series(randn(3), index=rng)
	
	p_ts = ts.to_period()
	
	p_ts
	
	# (2) 创建以 period 为索引的时间序列 
	# 将某数据集中的某一列或某几列时间数据作为时间序列索引
	# range1 = pd.PeriodIndex(year=data.year, quarter=data.quarter, freq='Q-DEC')
	# p_ts1 = pd.Series(np.random.randn(6), index=range1) 
	# 直接生成一系列Period对象放在一个PeriodIndex中,作为索引。
	range2 = pd.period_range('1/1/2000','6/6/2000', freq='M')
	p_ts2 = pd.Series(np.random.randn(6), index=range2) 
	
	p_ts2

数据重采样

	# (1) 降采样 
	rng = pd.date_range("1/1/2000", periods=90, freq="D")
	ts = pd.Series(randn(90), index=rng)
	ts
	
	# 按月进行降采样 求和形式
	ts.resample("M").sum()
	
	# 按月进行降采样 求均值形式
	ts.resample("M").mean()
	
	# 每隔 3天进行一次降采样
	ts.resample("3D").sum()
	
	# 也可以通过转换为 period 指定为别的频率 
	# 按照天往后指定 6 个时间
	rng = pd.date_range("1/29/2000", periods=6, freq="D")
	rng
	
	ts2 = pd.Series(np.random.randn(6), index=rng)
	ts2
	
	# 转换为年-月形式的频率
	ts2.to_period("M")
	
	# (2) 升采样
	# 升采样会产生缺失值,就有数据填充的问题 
	# 按照 3D 的频率往后生成 10 个数据
	rng = pd.date_range("1/1/2018", periods=10, freq="3D")
	rng
	
	# 以此为索引创建时间序列 
	ts = pd.Series(np.random.randn(10), index=rng)
	ts
	
	# 升采样 
	# ffill(1)  # 使用非空值填充其后面的 1 个空值 
	ts.resample("D").ffill(1)
	# bfill(2)  # 使用非空值填充其前面的 2 个空值 
	ts.resample("D").bfill(2)
	
	# interpolate, 线性取值 
	ts.resample("D").interpolate("linear")

设置和转换时区

# 创建一个以 rng 为索引的时间序列对象
ts = pd.Series(np.random.randn(len(rng)), rng)

ts

# 为时间序列对象设置时区
ts_utc = ts.tz_localize("UTC")

ts_utc

# 转换时区
ts_utc.tz_convert("US/Eastern")

时间序列形式转换

rng = pd.date_range("1/1/2012", periods=5, freq="M")

rng

ts = pd.Series(np.random.randn(len(rng)), index=rng)

ts

# 转换为 年-月形式
ps = ts.to_period()

ps

# 转换回时间戳形式 
ps = ps.to_timestamp()

ps

针对period_range的采样

prng = pd.period_range("1990Q1", "2000Q4", freq="Q-NOV")
prng

ts = pd.Series(np.random.randn(len(prng)), prng)
ts

# 对于每一个period进行采样 
# 以月份为频率的最后一个月+1月; 以小时为频率的最后1s+9个小时
ts.index = (prng.asfreq("M", "e") + 1).asfreq("H", "s") + 9 
ts.index

ts.head()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值