Python+pandas 特殊时间序列的生成

时间:2024-03-31 16:33:30

一、 date_range()函数

date_range()函数是pandas库的函数,顾名思义,该函数应该能生成指定区间的时间序列。
Python+pandas 特殊时间序列的生成

举例:

1、 使用“开始时间”和“结束时间” 生成2020-01-01至2020-01-07的7个日期

【脚本】
print(pd.date_range(‘20200101’, ‘20200107’))
【结果】
DatetimeIndex([‘2020-01-01’, ‘2020-01-02’, ‘2020-01-03’, ‘2020-01-04’,
‘2020-01-05’, ‘2020-01-06’, ‘2020-01-07’],
dtype=‘datetime64[ns]’, freq=‘D’)
【注意】
这的数据类型不是datetime,而是DatetimeIndex; freq默认为’D’

2、 使用“开始时间”和“期数”生成2020-01-01至2020-01-07的7个日期

【脚本】
print(pd.date_range(‘20200101’, periods=7))

3、 按月 使用“开始时间”和“期数”生成2020-01-31至2020-07-31的7个以月为间隔的日期(月底日)

【脚本】
print(pd.date_range(‘20200101’, periods=7, freq=‘M’))
【结果】
DatetimeIndex([‘2020-01-31’, ‘2020-02-29’, ‘2020-03-31’, ‘2020-04-30’,
‘2020-05-31’, ‘2020-06-30’, ‘2020-07-31’],
dtype=‘datetime64[ns]’, freq=‘M’)

4、 按月 使用“开始时间”和“期数”生成2020-01-01至2020-07-01的7个以月为间隔的日期(月初日)

【脚本】
print(pd.date_range(‘20200101’, periods=7, freq=‘M’))
【结果】
DatetimeIndex([‘2020-01-01’, ‘2020-02-01’, ‘2020-03-01’, ‘2020-04-01’,
‘2020-05-01’, ‘2020-06-01’, ‘2020-07-01’],
dtype=‘datetime64[ns]’, freq=‘MS’)
【注意】
这里的“MS”不能写成小写,写成小写即以毫秒为时间间隔,等价于freq=‘L’。结果为这样:
DatetimeIndex([ ‘2020-01-01 00:00:00’, ‘2020-01-01 00:00:00.001000’,
‘2020-01-01 00:00:00.002000’, ‘2020-01-01 00:00:00.003000’,
‘2020-01-01 00:00:00.004000’, ‘2020-01-01 00:00:00.005000’,
‘2020-01-01 00:00:00.006000’],
dtype=‘datetime64[ns]’, freq=‘L’)

5、 按月 使用“开始时间”和“期数”生成2020-01-31至2020-12-31的,每2个月为一个间隔的日期

【脚本】
print(pd.date_range(‘20200101’, periods=6, freq=‘2M’))
【结果】
runfile(‘C:/Users/ZWY/PycharmProjects/firstPro/test.py’, wdir=‘C:/Users/ZWY/PycharmProjects/firstPro’)
DatetimeIndex([‘2020-01-31’, ‘2020-03-31’, ‘2020-05-31’, ‘2020-07-31’,
‘2020-09-30’, ‘2020-11-30’],
dtype=‘datetime64[ns]’, freq=‘2M’)

6、 按1.5小时为间隔取数

【脚本】
print(pd.date_range(‘20200101’, periods=6, freq=‘1h30min’))
【结果】
DatetimeIndex([‘2020-01-01 00:00:00’, ‘2020-01-01 01:30:00’,
‘2020-01-01 03:00:00’, ‘2020-01-01 04:30:00’,
‘2020-01-01 06:00:00’, ‘2020-01-01 07:30:00’],
dtype=‘datetime64[ns]’, freq=‘90T’)
【注意】
这里的’1h30min’中间没有冒号,等价于freq='90T '。结果为这样:

试错:print(pd.date_range(‘202001’, periods=7, freq=‘M’))

7、 怎样得到时间间隔为一个月的月份,而当是日期?

使用print(pd.date_range(‘2020-01’, periods=6, freq=‘M’))可以吗?
不可以!
解决方案:按个函数pd.period_range

二、 period_range()函数

1、 得到时间间隔为一个月的6期月份

【脚本】
print(pd.period_range(‘2020-01’, ‘2020-06’, freq=‘M’))
【结果】
PeriodIndex([‘2020-01’, ‘2020-02’, ‘2020-03’, ‘2020-04’, ‘2020-05’, ‘2020-06’], dtype=‘period[M]’, freq=‘M’)
【注意】
1、这里的数据类型变了,变成了PeriodIndex,可以大胆地想一下,这个以时间段为范围的序列,是否可以使用以“年”、‘季度“为间隔的时间序列呢? 也可以的!

三、 PeriodIndex()函数

该函数会生成一些指定的不规则的时间段序列,注意函数字母的大小写。
如:values = [‘202001’, ‘202003’, ‘202002’, ‘202008’]
print(pd.PeriodIndex(values, freq=‘M’))

1、 生成一个间隔不均匀地季度时间序列

【脚本】
values = [‘2020Q1’, ‘2020Q3’, ‘2020Q2’, ‘2019Q3’]
print(pd.PeriodIndex(values, freq=‘Q’))
【结果】
PeriodIndex([‘2020Q1’, ‘2020Q3’, ‘2020Q2’, ‘2019Q3’], dtype=‘period[Q-DEC]’, freq=‘Q-DEC’)

2、 转换类:把一组月份转换成对应的季度

【脚本】
values = [‘2020-01’, ‘2020-03’, ‘2020-04’, ‘2019-05’, ‘2020-08’, ‘2020-12’]
print(pd.PeriodIndex(values, freq=‘Q’))
【结果】
PeriodIndex([‘2020Q1’, ‘2020Q1’, ‘2020Q2’, ‘2019Q2’, ‘2020Q3’, ‘2020Q4’], dtype=‘period[Q-DEC]’, freq=‘Q-DEC’)
【注意】
这里注意,values不能再设置为‘202001‘格式,而需要设置为‘2020-01’

3、 指定年月的时间序列

【脚本】
year = [‘2020’, ‘2019’, ‘2020’]
month = [‘01’, ‘2’, ‘3’]
print(pd.PeriodIndex(year,month, freq=‘M’))
【结果】
PeriodIndex([‘2020-01’, ‘2019-01’, ‘2020-01’], dtype=‘period[M]’, freq=‘M’)

四、 总结

date_range(),period_range()函数生成序列时,都有两种方法,一是(start, end, periods);一是(start, periods,freq)。而PeriodIndex()函数生成时间序列时稍显灵活,可以通过指定时间值,指定freq方法来生成。
关于freq,在不同函数中意义不同,我找到的资料如下:
(下图来源https://blog.csdn.net/lys_828/article/details/104649078)
Python+pandas 特殊时间序列的生成