前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​时间序列&日期学习笔记大全(上)

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

作者头像
朱小五
发布2020-09-16 14:08:17
1.5K0
发布2020-09-16 14:08:17
举报
文章被收录于专栏:凹凸玩数据凹凸玩数据

作者:湛林

来源:凹凸数据

1. 日期解析

代码语言:javascript
复制
# 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. 时区设置

代码语言:javascript
复制
# 设置时间的时区
dti = dti.tz_localize('UTC')
# 调整时间的时区
dti.tz_convert('US/Pacific')

3. 用增量进行时间计算

代码语言:javascript
复制
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 常规日期时间数据生成方法
代码语言:javascript
复制
# 传进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')
代码语言:javascript
复制
# 通过format设置特定的解析模式
pd.to_datetime('2010/11/12', format='%Y/%m/%d')
6.2从不同列中合并日期,生成时间数据
代码语言:javascript
复制
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 遇到无法解析数据的处理
代码语言:javascript
复制
# 有无法解析的直接全部报错
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 支持纪元时间和正常时间的转换

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

代码语言:javascript
复制
pd.to_datetime([1349720105, 1349806505], unit='s')
# 正常时间-某特定时间,转化成从特定时间至今的秒数(整数)
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')
6.5 使用origin创建时间
代码语言:javascript
复制
# 从1960-01-01起,分别加1,2,3。单位为Day
pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))

7. 生成带时间戳的index

代码语言:javascript
复制
# 两种方法均可以生成时间戳index
pd.DatetimeIndex(dates)
pd.Index(dates)
7.1 生成大量的时间戳index
代码语言:javascript
复制
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个周期
代码语言:javascript
复制
# 指定开始、结束和周期,将生成一个从开始到结束均匀间隔的日期范围
pd.date_range('2018-01-01', '2018-01-05', periods=5)
pd.date_range('2018-01-01', '2018-01-05', periods=10)
7.2 略过节假日和选特定日期的参数
代码语言:javascript
复制
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的特殊属性

代码语言:javascript
复制
# 日期或字符串解析数据可以作为索引
ts[datetime.datetime(2011, 12, 25):]    # 选2011.12.25后的日期数据
ts['10/31/2011':'12/31/2011']           # 切片选择数据
ts['2011']                              # 按年份选择数据
ts['2011-6']                            # 按年-月选择数据
代码语言:javascript
复制
# 数据框同样可以使用切片数据
# 选到日的时候,右侧是闭的,选
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被选入。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 凹凸数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 日期解析
  • 2. 时区设置
  • 3. 用增量进行时间计算
  • 4. pandas的日期支持
  • 5. 时间戳与时间跨度 Timestamps vs. Time Spans
  • 6. 生成时间数据
    • 6.1 常规日期时间数据生成方法
      • 6.2从不同列中合并日期,生成时间数据
        • 6.3 遇到无法解析数据的处理
          • 6.4 支持纪元时间和正常时间的转换
            • 6.5 使用origin创建时间
            • 7. 生成带时间戳的index
              • 7.1 生成大量的时间戳index
                • 7.2 略过节假日和选特定日期的参数
                • 8. 时间index的特殊属性
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档