python内置库和pandas中的时间常见处理(3)

2023-02-23 20:51:39 浏览数 (1)

本篇主要介绍pandas中的时间处理方法。

2 pandas库常见时间处理方法

时间数据在多数领域都是重要的结构化数据形式,例如金融、经济、生态学、神经科学和物理学。在多个时间点观测或测量数据形成了时间序列。多数时间序列是固定频率的,例如每1小时或每1天等。同样,时间序列也可以是不规则的,没有固定的时间单位或单位间偏移量。我们遇到的应用可能有以下几种:

1)时间戳,具体的时间时刻

2)固定的时间区间,例如2022年6月或整个2021年

3)时间间隔,由开始时间和结束时间表示

在这里,我们主要关注以上三种情况。

2.1 生成日期范围

在pandas中,生成日期范围使用pandas.date_range()方法实现。

1)根据开始时间和结束时间生成日期范围

代码语言:javascript复制
date_index = pd.date_range('2022-04-01', '2022-04-11')
date_index2 = pd.date_range('2022/04/01', '2022/04/11')
print(date_index, date_index2, sep = 'n')

结果如下:

代码语言:javascript复制
DatetimeIndex(['2022-04-01', '2022-04-02', '2022-04-03', '2022-04-04',
               '2022-04-05', '2022-04-06', '2022-04-07', '2022-04-08',
               '2022-04-09', '2022-04-10', '2022-04-11'],
              dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2022-04-01', '2022-04-02', '2022-04-03', '2022-04-04',
               '2022-04-05', '2022-04-06', '2022-04-07', '2022-04-08',
               '2022-04-09', '2022-04-10', '2022-04-11'],
              dtype='datetime64[ns]', freq='D')

2)给定开始日期或结束日期生成指定长度的日期

代码语言:javascript复制
#生成2022.4.1之后的5天日期
start_date_ls = pd.date_range(start = '2022-04-01', periods = 5)
#生成2022.6.1之前的5天日期
end_date_ls = pd.date_range(end = '2022-06-01', periods = 5)
print(start_date_ls, end_date_ls, sep = 'n')

结果如下:

代码语言:javascript复制
DatetimeIndex(['2022-04-01', '2022-04-02', '2022-04-03', '2022-04-04',
               '2022-04-05'],
              dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2022-05-28', '2022-05-29', '2022-05-30', '2022-05-31',
               '2022-06-01'],
              dtype='datetime64[ns]', freq='D')

3)提供频率参数(freq),根据频率增减日期

pandas中支持的频率值有:

别名

偏置类型

描述

D

Day

日历的每天

B

BusinessDay

工作日的每天

H

Hour

每小时

T或min

Minute

每分钟

S

Second

每秒钟

M

Monthend

日历的每月月底

BM

BusinessMonthend

工作日的月底日期

MS

MonthBegin

日历的每月月初

BMS

BussinessMonthBegin

工作日的月初日期

W-MON、W-TUE...

Week

根据给定日期每周取日期

WOM-1MON,WOM-2MON...

WeekOfMonth

本月的第一、二、三或四周创建按周分隔日期

代码语言:javascript复制
#按照4小时的间隔增加日期
hour4_date_ls = pd.date_range(start = '2022-04-01', periods = 5, freq = '4H')
#按照1h30min间隔增加日期
hoursp_date_ls = pd.date_range(start = '2022-04-01', periods = 5, freq = '1h30min')
#获取从2021.1.1到2021.6.1之间每个月的第三周的周五
rng = pd.date_range('2021-01-01', '2021-06-01', freq = 'WOM-3FRI')

结果如下:

代码语言:javascript复制
DatetimeIndex(['2022-04-01 00:00:00', '2022-04-01 04:00:00',
               '2022-04-01 08:00:00', '2022-04-01 12:00:00',
               '2022-04-01 16:00:00'],
              dtype='datetime64[ns]', freq='4H')
DatetimeIndex(['2022-04-01 00:00:00', '2022-04-01 01:30:00',
               '2022-04-01 03:00:00', '2022-04-01 04:30:00',
               '2022-04-01 06:00:00'],
              dtype='datetime64[ns]', freq='90T')
DatetimeIndex(['2021-01-15', '2021-02-19', '2021-03-19', '2021-04-16',
               '2021-05-21'],
              dtype='datetime64[ns]', freq='WOM-3FRI')    

2.2 生成时间序列

pandas中的基础时间序列种类是由时间戳索引的Series,在pandas外部通常表示为python字符串或datetime对象。

1)由datetime对象生成时间序列

代码语言:javascript复制
import datetime
import numpy as np
start_ = datetime.datetime(2022, 7, 1)
date_ls = []
#如果日期小于指定日期,则按照3天自增 
while start_ <= datetime.datetime(2022, 7, 15):
    date_ls.append(start_)
    start_ = start_   datetime.timedelta(days = 3)
ts = pd.Series(np.random.randn(5), index = date_ls)
print(ts)

结果如下:

代码语言:javascript复制
2022-07-01    0.575911
2022-07-04   -0.815488
2022-07-07    1.157925
2022-07-10   -0.785095
2022-07-13    0.557441
dtype: float64

2)根据pandas生成的日期范围生成序列

代码语言:javascript复制
longer_ts = pd.Series(np.random.randn(5), index = pd.date_range('2022-07-01', periods = 5, freq = '3D'))
print(longer_ts)

结果如下:

代码语言:javascript复制
2022-07-01   -3.219906
2022-07-04   -1.153937
2022-07-07    1.316498
2022-07-10   -0.919213
2022-07-13   -0.938071
Freq: 3D, dtype: float64

2.3 时间序列常见操作

pandas的时间序列我们可以对其进行切片和选择子集等操作。

现构造一个时间序列,记录了从2019年1月1日起,每隔5天生成一个随机数的时间序列:

代码语言:javascript复制
longer_ts = pd.Series(np.random.randn(100), index = pd.date_range('2019-01-01', periods = 100, freq = '5D'))

1)获取2020年的数据(获取指定年份数据)

代码语言:javascript复制
sel_year = longer_ts['2020']

2)获取2020年4月数据(获取指定年月数据)

代码语言:javascript复制
sel_month = longer_ts['2020-04']

3)获取2020年之前的所有数据(获取指定时间之前数据)

代码语言:javascript复制
sel_before = longer_ts[:'2020']

4)获取2020年5月到2021年1月的所有数据(获取时间区间的数据)

代码语言:javascript复制
sel_mid = longer_ts['2020/5':'2021-1']

5)将2020年1月之前的数据重新赋值(对指定时间重新赋值)

代码语言:javascript复制
#将2020年1月之前的所有数据赋值为1  
longer_ts.loc[:'2020-01'] = 1

参考来源:

1.《利用python进行数据分析》,Wes McKinney著,徐敬一译,第一版.

2.,pandas官方文档:https://pandas.pydata.org/pandas-docs/stable/

3.datetime官方文档:https://docs.python.org/zh-cn/3/library/datetime.html‍

0 人点赞