Pandas 是非常著名的开源数据处理库
在 Pandas 中关于时间序列的常见对象有 6 种,分别是 :
以下不同代码都可以生成相同时间戳。
import pandas as pd
pd.Timestamp(2018, 10, 1)
pd.Timestamp("2018-10-1 10:00:1")
from datetime import datetime
pd.Timestamp(datetime(2018, 10, 1))
以下代码都可以生成相同时间段
1.
pd.Period('2018-10')
Period()
函数后面:
freq
参数决定时间段的分割长度。pd.Period('2018-10', freq='D')
Pandas 中常用 to_datetime()
函数:
Series
。df = ['2018-08-01', '2018-09-01', '2018-10-01']
pd.to_datetime(df)
df = pd.Series(['Sep 30, 2018', '2018-10-1', None])
pd.to_datetime(df)
df = pd.DataFrame({'year': [2017, 2018],'month': [9, 10],'day': [30, 1],'hour': [23, 0]})
pd.to_datetime(df)
要生成带有时间戳的索引
DatetimeIndex()
构造函数dates = ['2018-08-01', '2018-09-01', '2018-10-01']
index = pd.DatetimeIndex(dates)
index
实际运用中我们经常需要大量的的时间戳的索引。
date_range()
和 bdate_range()
来index = pd.date_range('2018-9-30', periods=250, freq='M')
index
index = pd.bdate_range('2018-10-1', periods=111)
index
在 date_range()
和 ·bdate_range()
中:
start
,end
, periods
,freq
等参数的各种组合start = datetime(2017, 10, 1)
end = datetime(2018, 10, 1)
rng = pd.date_range(start, end, freq='W')
rng
pd.bdate_range(end=end, periods=250)
同理,时间段也能作为索引使用
period_range()
。
pi = pd.period_range('2018-9-30', periods=666)
pi
以时间为索引的 Series 对象指的是在该 Series 中
import numpy as np
dates = [pd.Timestamp('2018-08-01'), pd.Timestamp('2018-09-01'),pd.Timestamp('2018-10-01')] # 创建三个时间元素。
ts = pd.Series(np.random.randn(3), dates) # 创建索引值为随机数的 Series 对象。
ts
periods = [pd.Period('2018-08'), pd.Period('2018-09'), pd.Period('2018-10')]
ts = pd.Series(np.random.randn(3), periods)
ts
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts
prng = pd.period_range('2017Q1', '2018Q4', freq='Q-NOV')
# 行索引为时间段索引,列索引为 A。
ps = pd.DataFrame(np.random.rand(len(prng)), columns=['A'], index=prng)
ps
以时间戳为索引的 Series
、DataFrame
对象
ts
ts[:10]
ts[::2]
ts[[0, 2, 6]]
ts["09/30/2018"]
ts[datetime(2018, 9, 30)]
ts["2017"]
ts["2018-9"]
DataFrame
对象的查找规则与以时间戳的相同。ps
ps["2017"]
3. 查找 2017 年 12 月 31 日前的所有季度的记录。
ps[:datetime(2017, 12, 31)]
ps["2018-06"]
使用 truncate()
ts.truncate(before='11/26/2017', after='4/29/2018')
将时间索引 Series 中的值向后和向前移动。
shift()
。ts = ts[:5] # 取前 5 条数据方便观察。
ts
ts.shift(1)
除了元素可以被移动,索引本身也能被移动,需要加上 freq
参数。
ts.shift(1, freq='W')
重采样可以通俗得理解为改变时间索引的个数
resample()
函数
增大时间间隔,减少记录的数量。
rng = pd.date_range('10/1/2018', periods=10, freq='D')
ts = pd.Series(np.random.randint(0, 50, len(rng)), index=rng)
ts
ts.resample('W').sum()
ts.resample('W').mean()
3. 使用 ohlc()
函数对所用未被采样值进行统计。
ts.resample('W').ohlc()
减小时间间隔频率,增加记录的数量
ts.resample('12H').asfreq()
2. ffill()
函数
ts.resample('12H').ffill()
下表是 Pandas 内建的一些时间类,常用于时间索引的位移。
pandas.tseries.offsets
模块from pandas.tseries.offsets import DateOffset
DateOffset()
实现时间戳位移。d = pd.Timestamp(2018, 10, 1, 10, 1, 1)
d
from pandas.tseries.offsets import DateOffset
d + DateOffset(months=1, days=2)
from pandas.tseries.offsets import BDay
d - 10 * BDay()
from pandas.tseries.offsets import BMonthEnd
d + BMonthEnd()
from pandas.tseries.offsets import YearEnd
d + YearEnd(month=2)
from pandas.tseries.offsets import Week
d - Week(weekday=4)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21wPEHpa-1619944756240)()]
rollforward()
offset = BMonthEnd()
llforward(d)
llback(d)
rng
rng + DateOffset(days=2)
rng + 2*BDay()
from pandas.tseries.offsets import Minute
rng + Minute(15)
参数名 | 说明 |
---|---|
B | 工作日频率 |
C | 定制工作日频率 |
D | 日历日频率 |
W | 每周频率 |
M | 月结束频率 |
SM | 半月结束频率(15 个月和月末) |
BM | 业务月末频率 |
CBM | 定制业务月末频率 |
MS | 月起始频率 |
sMs | 半月起始频率(第 1 和 15) |
BMS | 业务月开始频率 |
CBMS | 定制商业月份开始频率 |
Q | 四分频结束频率 |
BQ | 业务四分之一频率 |
QS | 四分频启动频率 |
BQS | 业务季开始频率 |
A | 年结束频率 |
BA | 业务年结束频率 |
AS | 年起始频率 |
BAS | 业务年开始频率 |
BH | 工作时间频率 |
H | 每小时频率 |
T, min | 分钟频率 |
S | 次频 |
L, ms | 毫秒 |
U, uS | 微秒 |
N | 纳秒 |
pd.date_range("2018-10-1", periods=10, freq='1D1H1min10U')
以下频率参数可以指定后缀以达到改变默认间隔点的效果。
pd.date_range("2018-10-1", periods=10, freq='W-WED')
n
参数如果起始时间是刚好在频率点上
使用 n
参数可以决定是否让该点参与计算
n=1
时参与计算。from pandas.tseries.offsets import MonthBegin
pd.Timestamp('2018-10-1') + MonthBegin(n=1)
n=0
时不参与计算pd.Timestamp('2018-10-1') + MonthBegin(n=0)
下采样中的聚合是指 下采样后,对未被采样到的点进行的一系列计算。
DataFrame
df = pd.DataFrame(np.random.rand(100, 3),index=pd.date_range('10/1/2018', freq='D', periods=100),columns=['A', 'B', 'C'])
r = df.resample('M')
r
r.sum()
r[['A', 'C']].mean()
agg()
同时进行不同的计算。 r.agg([np.sum, np.mean])
r['A'].agg([np.sum, np.mean, np.std])
r.agg({'A': ['sum', 'std'], 'B': ['mean', 'std']})
本文发布于:2024-01-28 09:41:58,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064061226519.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |