​时间序列&日期学习笔记大全(上)

时间:2022-07-25
本文章向大家介绍​时间序列&日期学习笔记大全(上),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

作者:湛林

来源:凹凸数据

1. 日期解析

# pd.to_datetime 可以解析多种格式的日期形式
pd.to_datetime(['1/1/2018', np.datetime64('2018-01-01'),
                datetime.datetime(2018, 1, 1)])
# 生成固定频率的日期
pd.date_range('2018-01-01', periods=3, freq='H')

2. 时区设置

# 设置时间的时区
dti = dti.tz_localize('UTC')
# 调整时间的时区
dti.tz_convert('US/Pacific')

3. 用增量进行时间计算

a = pd.Timestamp('2018-01-05')
# 输出a 是周几
a.day_name()
# 加一天
b = a + pd.Timedelta('1 day')
b.day_name()
# 加一个工作日
c = a + pd.offsets.BDay()
c.day_name()

4. pandas的日期支持

pandas中一共有四种日期类型,分别是

  • Date times:一种特定的日期、时间,可以含时区特征
  • Time deltas:一种绝对时间增量
  • Time spans:时间跨度
  • Date offsets:与日历运算相关的相对时间持续时间(会被已object形式存储)

对于时间序列数据,传统的做法是在一个序列或DataFrame的索引中表示时间成分,这样就可以对时间元素执行操作。pandas也可以将时间作为数据

5. 时间戳与时间跨度 Timestamps vs. Time Spans

时间戳数据是时间序列数据的最基本类型,它将值与时间点关联起来。对于panda对象,它意味着使用时间点。

时间跨度是指一个时期,period。周期表示的跨度可以明确指定,也可以从字符串中推断得到。

上述二者都可以成为index,而且如果是列表,则会自动被识别为index

6. 生成时间数据

6.1 常规日期时间数据生成方法

# 传进Series,返回的也是Series
pd.to_datetime(pd.Series(['Jul 31, 2009', '2010-01-10', None]))
# 传进列表,返回的是一个DatetimeIndex
pd.to_datetime(['2005/11/23', '2010.12.31'])
# 传入dayfirst=True,设置解析日期时的格式是日-月-年,否则就是月-日-年
pd.to_datetime(['12-01-2012', '01-12-2012'], dayfirst=False)
# infer参数可以用于让计算机自己推测 时间间隔
pd.DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], freq='infer')
# 通过format设置特定的解析模式
pd.to_datetime('2010/11/12', format='%Y/%m/%d')

6.2从不同列中合并日期,生成时间数据

df = pd.DataFrame({'year': [2015, 2016], 'month': [2, 3],'day': [4, 5], 'hour': [2, 3]})
# 用数据框的而不同列拼凑成一个日期数据
pd.to_datetime(df)
# 选特定的要素组成日期数据,必选的是年月日,可选的是时分秒等
pd.to_datetime(df[['year', 'month', 'day']])

6.3 遇到无法解析数据的处理

# 有无法解析的直接全部报错
pd.to_datetime(['2009/07/31', 'asd'], errors='raise')
# 无法解析的忽略,原封不动返回
pd.to_datetime(['2009/07/31', 'asd'], errors='ignore')
# 无法解析的返回 空值
pd.to_datetime(['2009/07/31', 'asd'], errors='coerce')

6.4 支持纪元时间和正常时间的转换

从元年开始,至今的秒数,可以转换为正常 年月日 的日期

pd.to_datetime([1349720105, 1349806505], unit='s')
# 正常时间-某特定时间,转化成从特定时间至今的秒数(整数)
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')

6.5 使用origin创建时间

# 从1960-01-01起,分别加1,2,3。单位为Day
pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))

7. 生成带时间戳的index

# 两种方法均可以生成时间戳index
pd.DatetimeIndex(dates)
pd.Index(dates)

7.1 生成大量的时间戳index

start = datetime.datetime(2011, 1, 1)
end = datetime.datetime(2012, 1, 1)
# date_range是自然日
pd.date_range(start, end)
# bdate_range是工作日
pd.bdate_range(start, end)
# 还可以传入开始,period,频率参数生成
pd.date_range(start, periods=1000, freq='M')
pd.bdate_range(start, periods=250, freq='BQS')
# 传入首尾,频率
pd.date_range(start, end, freq='BM')
pd.date_range(start, end, freq='W')
# 传入开始 或结尾,period参数
pd.bdate_range(end=end, periods=20)     # 结束往前推20个周期
pd.bdate_range(start=start, periods=20) # 开始往后推20个周期
# 指定开始、结束和周期,将生成一个从开始到结束均匀间隔的日期范围
pd.date_range('2018-01-01', '2018-01-05', periods=5)
pd.date_range('2018-01-01', '2018-01-05', periods=10)

7.2 略过节假日和选特定日期的参数

weekmask = 'Mon Wed Fri'        # 只能是 ‘Mon Tue Wed Thu Fri’ 多选
holidays = [datetime.datetime(2011, 1, 5), datetime.datetime(2011, 3, 14)]
# 设置holidays 和 mask,剔除holidays的日期,直选mask设定的周X,默认全部工作日
pd.bdate_range(start, end, freq='C', weekmask=weekmask, holidays=holidays)

8. 时间index的特殊属性

# 日期或字符串解析数据可以作为索引
ts[datetime.datetime(2011, 12, 25):]    # 选2011.12.25后的日期数据
ts['10/31/2011':'12/31/2011']           # 切片选择数据
ts['2011']                              # 按年份选择数据
ts['2011-6']                            # 按年-月选择数据
# 数据框同样可以使用切片数据
# 选到日的时候,右侧是闭的,选
dft['2013-1':'2013-2']          # 最后一条2013/02的数据也会选入
dft['2013-1':'2013-2-28']       # 2013.2.28的全部数据会被选入
dft['2013-1':'2013-2-28 00:00:00']  # 有精确时间的,最后00:00:00被选入。