文章数据
收藏(次)

【python数据分析】第十一章 时间序列-2

加关注

from datetime import datetime
from datetime import timedelta
from dateutil.parser import parse
import pandas as pd
import numpy as np
--------------------------------------------------------------------------------
dates = [datetime(2011, 1, 2), datetime(2011, 1, 5),
datetime(2011, 1, 7), datetime(2011, 1, 8),
datetime(2011, 1, 10), datetime(2011, 1, 12)]

ts = pd.Series(np.random.randn(6), index=dates)
rets = ts.resample('D') # Resample time-series data. 重新设置时间序列,按照 D[间隔一天]
# 得到的新的数据类型 DatetimeIndexResampler, 他会把本不连续的时间
# 补充成间隔为1的完整时间。即 1月2 - 1月12 每天都有
--------------------------------------------------------------------------------
生成日期范围 date_range:

pd.date_range(
start=None,
end=None,
periods=None, # 生成多少个日期
freq=None, # 时间间隔
tz=None,
normalize=False,
name=None,
closed=None,
**kwargs,
) -> pandas.core.indexes.datetimes.DatetimeIndex
--------------------------------------------------------------------------------
pd.date_range('2020/10/8', '10/20/2020') # 指定起始时间, 默认的时间间隔是一天
输出:
DatetimeIndex(['2020-10-08', '2020-10-09', '2020-10-10', '2020-10-11',
'2020-10-12', '2020-10-13', '2020-10-14', '2020-10-15'],
dtype='datetime64[ns]', freq='D')
--------------------------------------------------------------------------------
pd.date_range('2020/10/8', periods=5) # 起始时间有了,生成5个
ff = pd.date_range('2020/10/8','10/15/2020', periods=15) # 开始结束时间都指定了,生成15个,无视默认频率
[x for x in ff] 输出:把默认的“天”间隔 天改成了 12小时,就是为了满足生成15个时间
[Timestamp('2020-10-08 00:00:00'),
Timestamp('2020-10-08 12:00:00'),
Timestamp('2020-10-09 00:00:00'),
Timestamp('2020-10-09 12:00:00'),
Timestamp('2020-10-10 00:00:00'),
Timestamp('2020-10-10 12:00:00'),
Timestamp('2020-10-11 00:00:00'),
Timestamp('2020-10-11 12:00:00'),
Timestamp('2020-10-12 00:00:00'),
Timestamp('2020-10-12 12:00:00'),
Timestamp('2020-10-13 00:00:00'),
Timestamp('2020-10-13 12:00:00'),
Timestamp('2020-10-14 00:00:00'),
Timestamp('2020-10-14 12:00:00'),
Timestamp('2020-10-15 00:00:00')]

# 下面这两个报错,他没办法同时满足 periods=15, freq='D' 这两个条件,
# 也就是 periods 和 freq 只能使用其中一个,同时指定就报错。
ff = pd.date_range('2020/10/8','10/15/2020', periods=15, freq='D')
ff = pd.date_range('2020/10/8','10/15/2020', periods=5, freq='D')
ff = pd.date_range('2020/10/8','10/15/2020', periods=8, freq='D') # 这个可以满足还是报错
报错:Of the four parameters: start, end, periods, and freq, exactly three must be specified
这四个参数如果指定了,那就必须指定任意的三个。
--------------------------------------------------------------------------------
pd.date_range('2020/10/8 12:13:14', periods=5)
输出: 带了具体的时间,生成的也有时间
DatetimeIndex(['2020-10-08 12:13:14', '2020-10-09 12:13:14',
'2020-10-10 12:13:14', '2020-10-11 12:13:14',
'2020-10-12 12:13:14'],
dtype='datetime64[ns]', freq='D')
#如果只有时间,没有日期,默认的间隔又是一月,所以他推断开始日期是今天的日期
pd.date_range('12:13:14', periods=5)
DatetimeIndex(['2020-10-19 12:13:14', '2020-10-20 12:13:14',
'2020-10-21 12:13:14', '2020-10-22 12:13:14',
'2020-10-23 12:13:14'],
dtype='datetime64[ns]', freq='D')
#指定的日期带有时间,但是生成的日期希望不要带时间,使用 normalize=True, 把时间归一到一天的开始
[x for x in pd.date_range('12:13:14', periods=5, normalize=True)]
输出:
[Timestamp('2020-10-19 00:00:00', freq='D'),
Timestamp('2020-10-20 00:00:00', freq='D'),
Timestamp('2020-10-21 00:00:00', freq='D'),
Timestamp('2020-10-22 00:00:00', freq='D'),
Timestamp('2020-10-23 00:00:00', freq='D')]
--------------------------------------------------------------------------------
参数 freq 指定时间的间隔(偏移量) ,下面是它的取值,不完整
--------------------------------------------------------------------------------
别名 类型 说明
D Day 日历上的一天
B BussinessDay 工作日一天
H Hour 小时, '4H' 4小数
T或min Minute 分钟 '5T' 5分钟 '2h4t' 2小时4分钟
S Second 秒
L或ms Milli 毫秒 10^-3
U Micro 微秒 10^-6
M MonthEnd 每月最后一个日历日,间隔一月
BM BusiMonthEnd 每月最后一个工作日,间隔一月
MS MonthBegin 每月第一个日历日,间隔一月
BMS BusiMonthBegin 每月第一个工作日,间隔一月
W-MON W-TUE Week 间隔一周,每周的周几(MON, TUE, WED,THU,FRI,SAT,SUN)
WOM-1MON WOM-2MON week-of-month 每月有四周,一月中第几周的周几, WOM-3FRI : 每月第三周的周五,间隔一月
Q-JAN Q-FEB QUarterEnd 周期是3个月,即一个季度
这里的季度不要按照常规的季度理解,比如常规的1季度就是1,2,3月
这里是说财年结束。比如 Q-FEB 表明财年在2月月末结束,
那么财务一年时间是 某年3月1号到次年的2月末,不是常规的1月-12月
季度划分就变成了 [3-5] [6-8] [9-11] [12-2]
pd.date_range('2018-2-1', periods=4, freq='Q-FEB')
输出: ['2018-02-28', '2018-05-31', '2018-08-31', '2018-11-30']
第一个为什么是2月28, 因为开始时间指定了 '2018-2-1',需要产生的第一个数据
最早是本季度的最后一天,'2018-2-1' 正好处在 [12-2] 这个季度,
所以季度最后一天是 '2018-02-28'
BQ-JAN BQ-FEB BusiQuarterEnd 财年结束是在给定月的最后一个工作日。
比如 BQ-OCT, 表明是 10月最后一个工作日是财年结束,2020-10-30 是周五
也就说,2020-10-30是结束日。如果2020-10-31又有财务收入,收入是纳入一个新
的季度的,和 2020-10-30 那天的收入是在两个季度分别计入的。
季度划分 [8-10.30] [10.31-2021-01-29]
pd.date_range('2020-10-31', periods=4, freq='BQ-OCT')
的输出:['2021-01-29', '2021-04-30', '2021-07-30', '2021-10-29']
QS-JAN QS-FEB QuarterBegin 财年在QS-OCT指定的月的第一个日历日结束,第二个日历日就是下一个财年的一季度第一天
pd.date_range('2020-10-1', periods=4, freq='QS-OCT')
输出:['2020-10-01', '2021-01-01', '2021-04-01', '2021-07-01']
pd.date_range('2020-10-2', periods=4, freq='QS-OCT')
输出:['2021-01-01', '2021-04-01', '2021-07-01', '2021-10-01'] 下一财年了
BQS-JAN BQS-FEB BusiQuarterEnd 在把周末工作日考虑进去
A-JAN A-FEB YearEnd 频率是1年,锚定点在指定的月的最后一个日历日,比如 A-OCT 年度结束是 10月31(日历日)
BA-JAN BA-FEB BusiYearEnd 频率是1年,锚定点在指定月的最后一个工作日
AS-JAN AS-FEB YearBegin 频率是1年,锚定点在指定月的第一个日历日
BAS-JAN BAS-FEB BusiYearBegin 频率是1年,锚定点在指定月的第一个工作日
官方英文文档:中文翻译以后的简直看不懂
https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
--------------------------------------------------------------------------------
pd.tseries.offsets.Hour(2) + pd.tseries.offsets.Minute(30) # 输出: <150 * Minutes>
还不知道有什么用,记录一下,有这样一个东西。
--------------------------------------------------------------------------------
pd.date_range('2020-10-19', periods=5, freq='1h30min')
--------------------------------------------------------------------------------
pd.date_range('2020-10-19', periods=5, freq='wom-3FRI') 每月第三周周五
--------------------------------------------------------------------------------



>> 目录 << 


 

分享
收藏
点赞人
举报
文章标签
评论列表

推荐

暂无推荐