本篇主要介绍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 | 本月的第一、二、三或四周创建按周分隔日期 |
#按照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