【pandas】 之 pandas.date_range 函数

____tz_zs

使用 pandas.date_range 函数,能够非常方便的生成 指定频率、指定起始时间的时间序列。

一、pandas.date_range 参数介绍

pandas.date_range(start=None, end=None, periods=None, freq='D', tz=None, normalize=False, name=None, closed=None, **kwargs)

参数:

  • start:string 或 datetime-like,默认值是 None,表示日期的起点。
  • end:string 或 datetime-like,默认值是 None,表示日期的终点。
  • periods:integer 或 None,默认值是 None,表示你要从这个函数产生多少个日期索引值;如果是 None 的话,那么 start 和 end 必须不能为 None。
  • freq:string 或 DateOffset,默认值是 'D',表示以自然日为单位,这个参数用来指定计时单位,比如 '5H' 表示每隔 5 个小时计算一次。
  • tz:string 或 None,表示时区,例如:'Asia/Hong_Kong'。
  • normalize:bool,默认值为 False,如果为 True 的话,那么在产生时间索引值之前会先把 start 和 end 都转化为当日的午夜 0 点。
  • name:str,默认值为 None,给返回的时间索引指定一个名字。
  • closed:string 或者 None,默认值为 None,表示 start 和 end 这个区间端点是否包含在区间内,可以有三个值,'left' 表示左闭右开区间,'right' 表示左开右闭区间,None 表示两边都是闭区间。

返回值:

  • DatetimeIndex

简单示例:

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""
tz_zs
"""
import pandas as pd
import time

date_time_index = pd.date_range(start="6/29/2018", end="7/2/2018")
print date_time_index

date_time_index = pd.date_range(start="6/29/2018", periods=4)
print date_time_index

date_time_index = pd.date_range(periods=4, end="7/2/2018")
print date_time_index

date_time_index = pd.date_range(start="2018-06-29", end="2018-07-02")
print date_time_index

date_time_index = pd.date_range(start="2018-6-29", end="2018-7-2")
print date_time_index

'''
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
'''

参数 freq

数据格式 string 或 DateOffset,默认值是 'D',表示以自然日为单位。这个参数用来指定计时频率,比如  '5H'  表示每隔 5 个小时计算一次。

一些串别名被赋予有用的常见时间序列频率。我们将把这些别名称为偏移别名。

B       工作日频率
D       日历日频率
W       每周频率
W-SUN   星期天为起始(Sundays). 等同 ‘W’
W-MON   星期一为起始(Mondays)
W-TUE   星期二为起始(Tuesdays)
W-WED   星期三为起始(Wednesdays)
W-THU   星期四为起始(Thursdays)
W-FRI   星期五为起始(Fridays)
W-SAT   星期六为起始(Saturdays)
WOM     每月的第几周的第几天

BH      工作小时级频率
H       小时级频率
T,min   分钟级频率
S       秒级频率
L,ms    毫秒
U,us    微秒
N       纳秒

M       月结束频率,如'2018-11-30', '2018-12-31'
SM      半月结束频率(15日和月末)
BM      工作月结束频率
MS      月起始频率,如'2018-12-01'
SMS     短信半月开始频率(第1和第15)
BMS     工作月份开始频率

Q       季末频率
BQ      工作季度结束频率
QS      季度开始频率
BQS     工作季度开始频率

A,Y     年结束频率,如'2000-12-31'
A-DEC   年级别的频率,以 十二月(December) 为年底,等同 'A'。
A-JAN   年级别的频率,以 一月(January )为年底。(其他二到十一月:FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV)
BA,BY   工作年度结束频率
AS,YS   年开始频率
BAS,BYS 工作年度开始频率

更多:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases

示例:

# freq 字段
date_time_index = pd.date_range(start="2018-01-01", end="2018-07-01", freq='M')
print date_time_index

date_time_index = pd.date_range(start="2018-01-01", end="2018-07-01", freq='3M')
print date_time_index
'''
DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30',
               '2018-05-31', '2018-06-30'],
              dtype='datetime64[ns]', freq='M')
DatetimeIndex(['2018-01-31', '2018-04-30'], dtype='datetime64[ns]', freq='3M')
'''

# 组合频率
d = pd.date_range("20190101", "20190215", freq='7D')
print(d)
"""
DatetimeIndex(['2019-01-01', '2019-01-08', '2019-01-15', '2019-01-22',
               '2019-01-29', '2019-02-05', '2019-02-12'],
              dtype='datetime64[ns]', freq='7D')
"""

d = pd.date_range("20190101", "20190102", freq='2h30min')
print(d)
"""
DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 02:30:00',
               '2019-01-01 05:00:00', '2019-01-01 07:30:00',
               '2019-01-01 10:00:00', '2019-01-01 12:30:00',
               '2019-01-01 15:00:00', '2019-01-01 17:30:00',
               '2019-01-01 20:00:00', '2019-01-01 22:30:00'],
              dtype='datetime64[ns]', freq='150T')
"""

WOM 每月的第几周的第几天

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
import pandas as pd

date_range = pd.date_range(start="2018-11-16", end="2019-01-08", freq="W-MON")
print(date_range)
"""
DatetimeIndex(['2018-11-19', '2018-11-26', '2018-12-03', '2018-12-10',
               '2018-12-17', '2018-12-24', '2018-12-31', '2019-01-07'],
              dtype='datetime64[ns]', freq='W-MON')
"""
date_range = pd.date_range(start="2018-09-16", end="2019-03-18", freq="WOM-2MON")  # 每月的第二个星期一
print(date_range)
"""
DatetimeIndex(['2018-10-08', '2018-11-12', '2018-12-10', '2019-01-14',
               '2019-02-11', '2019-03-11'],
              dtype='datetime64[ns]', freq='WOM-2MON')
"""

参数 tz

参数 tz 默认值:None,可以是 string 或 None,表示时区,例如:'Asia/Hong_Kong'。

# tz 字段,设置时区
date_time_index = pd.date_range(start="2018-06-29", end="2018-07-02", tz='Asia/Hong_Kong')
print date_time_index
'''
DatetimeIndex(['2018-06-29 00:00:00+08:00', '2018-06-30 00:00:00+08:00',
               '2018-07-01 00:00:00+08:00', '2018-07-02 00:00:00+08:00'],
              dtype='datetime64[ns, Asia/Hong_Kong]', freq='D')
'''

参数 closed

参数 closed 默认值为 None,可以是 string 或者 None,表示 start 和 end 这个区间端点是否包含在区间内,可以有三个值,'left' 表示左闭右开区间,'right' 表示左开右闭区间,None 表示两边都是闭区间。

# closed 字段的作用
date_time_index = pd.date_range(start="2018-06-29", end="2018-07-02", closed=None)
print date_time_index
date_time_index = pd.date_range(start="2018-06-29", end="2018-07-02", closed='left')
print date_time_index
date_time_index = pd.date_range(start="2018-06-29", end="2018-07-02", closed='right')
print date_time_index
'''
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2018-06-29', '2018-06-30', '2018-07-01'], dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2018-06-30', '2018-07-01', '2018-07-02'], dtype='datetime64[ns]', freq='D')
'''

.

二、pandas.DatetimeIndex

pandas.date_range  函数的返回值为一个 pandas.DatetimeIndex 对象。他是一个 datetime64 数据格式的不可变 ndarray,内部实现为 int64,可以携带频率信息等元数据传入到 Timestamp 对象(datetime 的子类)中。

pandas.DatetimeIndex 有许多属性和方法,能方便的转化和获取想要的输出结果。在此不做赘述,以后与同类型对象一起介绍。


属性:
year
month
day
hour
minute
second
microsecond
nanosecond
date
time
timetz
dayofyear
weekofyear
week
dayofweek
weekday
quarter
tz
freq
freqstr
is_month_start
is_month_end
is_quarter_start
is_quarter_end
is_year_start
is_year_end
is_leap_year
inferred_freq

方法:
normalize
strftime
snap
tz_convert
tz_localize
round
floor
ceil
to_period
to_perioddelta
to_pydatetime
to_series
to_frame
month_name
day_name
mean

 

三、打印输出不同格式的日期格式字符串

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""

@author:    tz_zs

"""
from collections import Iterator
import pandas as pd

date_range = pd.date_range(start="2017-01-01 10:00:00", end="2017-01-01 14:00:00", closed="left", freq="1h").format(formatter=lambda x: x.strftime('%Y-%m-%dT%H-%M-%SZ-1min'))
print(date_range)  # list
"""
['2017-01-01T10-00-00Z-1min', '2017-01-01T11-00-00Z-1min', '2017-01-01T12-00-00Z-1min', '2017-01-01T13-00-00Z-1min']
"""

date_range2 = pd.date_range(start="2017-01-01 10:00:00", end="2017-01-01 14:00:00", closed="left", freq="1h").tolist()
print(date_range2)  # list
"""
[Timestamp('2017-01-01 10:00:00', freq='H'), Timestamp('2017-01-01 11:00:00', freq='H'), Timestamp('2017-01-01 12:00:00', freq='H'), Timestamp('2017-01-01 13:00:00', freq='H')]
"""

date_range3 = pd.date_range(start="2017-01-01 10:00:00", end="2017-01-01 14:00:00", closed="left", freq="1h")
date_range3_iter = date_range3.__iter__()  # generator
print(isinstance(date_range3, Iterator))  # False
print(isinstance(date_range3_iter, Iterator))  # True
for i in range(date_range3.size):
    range_next = date_range3_iter.next()
    print(range_next)  # Timestamp
"""
2017-01-01 10:00:00
2017-01-01 11:00:00
2017-01-01 12:00:00
2017-01-01 13:00:00
"""

for i in date_range3:
    print(i)  # Timestamp
"""
2017-01-01 10:00:00
2017-01-01 11:00:00
2017-01-01 12:00:00
2017-01-01 13:00:00
"""

 

四、参考:

 

end

  • 13
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值