转换为时间对象
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()