前言
和其他语言相似,python内置有datetime对象,可以在datetime库中找到,pandas的日期时间类型默认是datetime64[ns]
一、python中日期时间类型
首先得导入这个包
# 导包
from datetime import datetime # 这个是原生Python包的内容
import pandas as pd
1.获取当前时间
t1 = datetime.now()
t1 # 你电脑此时显示的时间
2.手动设置日期
t2 = datetime(2024, 5, 5)
t2 # datetime.datetime(2024, 5, 5, 0, 0)
3.计算两个日期差
# 3. 计算两个日期差.
t2 - t1 # 返回的是datetime.timedelta类型
二、pandas中的日期时间类型
这里我们用一个数据集做演示吧
1.加载数据
# 1. 加载: 疫情期间的 埃博拉数据.
ebola = pd.read_csv('data/country_timeseries.csv')
ebola.head()
# 2. 查看每列详情.
ebola.info() # 发现 Date是object(字符串类型)的
2.转换类型
发现问题:date时间列是object字符串类型不方便我们数据分析操作,需要浅浅改变一下类型格式
# 3. 把Date列转成 datetime类型的时间, 并添加到 ebola这个df对象中.
ebola['date_df'] = pd.to_datetime(ebola['Date'])
# 4. 再次查看 ebola 这个df对象的列信息.
ebola.info() # pandas 中默认的日期时间类型就是 datetime64[ns]
结果如下:
三、获取日期中不同部分
1.把字符串转化成日期类型
# 把字符串转成日期类型
ts=pd.to_datetime('2024-05-01') # Timestamp类型
2.查看年份属性
ts.year #2024
ts.month # 5
ts.day # 1
ts.week # 18 年中的第几周
ts.quarter # 第几个季度 2
3.获取日期各个部分
#获取Series类型,日期各个部分,要先把Series转成DatetimeProperties(日期属性类型) .dt
ebola['Date'].dt.year
ebola['Date'].dt.month
ebola['Date'].dt.day
# ebola['Date'].dt.week
ebola['Date'].dt.quarter
#整合到原数据
# 把上述年月日重新赋值给ebola这个df对象
ebola['year']=ebola['Date'].dt.year
ebola['month'],ebola['day']=ebola['Date'].dt.month,ebola['Date'].dt.day
# ebola['month'],ebola['day']=(ebola['Date'].dt.month,ebola['Date'].dt.day)
# 查看添加新列后的数据
ebola[['Date','year','month','day']]
查看一下结果,以达成我们想要的样子
四、日期索引列和日期差索引列
日期索引列(DatetimeIndex)
日期差索引列(TimeDeltaIndex)
1.日期索引列
# 导入一个数据集
# parse_datas=['列名']直接在加载数据时转换日期类型
tesla=pd.read_csv('dataset05/TSLA.csv',parse_dates=[0])
tesla.info()
# 1.获取2015年8月的股票数据
#方式一:不使用日期时间索引列
tesla.loc[(tesla['Date'].dt.year==2015)&(tesla['Date'].dt.month==8)] # 用括号包裹,因为向量和标量不能直接比较,用连接符:&
# 方式二:把日期类型作为索引,即:DatetimeIndex,日期索引列
tesla.set_index('Date',inplace=True)
# tesla.index=tesla['Date'] # 效果同上
# tesla.loc['2015-08']
# tesla['2015-08'] #如果使用anaconda最新版本可能会报错,因为该用法已过时
tesla
2.日期差索引列
# TimedeltaIndex,时间差索引列
tesla=pd.read_csv('dataset05/TSLA.csv',parse_dates=[0])
tesla
# 计算特斯拉股票上市天数
tesla['ref_date']=tesla['Date']-tesla['Date'].min()
# 设置时间差类型为索引列,即:TimedeltaIndex
tesla.set_index('ref_date',inplace=True)
# 时间差类型作为索引列,结合切片使用
tesla['0 days':'5 days']
# 手动针对行索引列降序排列
tesla.sort_index(ascending=False)['5 days':'0 days']
五、生成时间日期序列
1.函数及参数解释
pd.date_range('起始时间','结束时间',freq=生成时间序列的方式)
frequency:出现频次
# 获取连续日历日
pd.date_range('2024-04-01','2024-05-01')# 包左包右
pd.date_range('2024-04-01','2024-05-01',freq='D')# 包左包右,D表示日历日
# 获取连续工作日
pd.date_range('2024-04-01', '2024-06-30', freq='B') # 包左包右, B表示: 工作日(周一 ~ 周五)
# 获取间隔一天的工作日
pd.date_range('2024-04-01', '2024-06-30', freq='2B') # 包左包右, B表示: 工作日(周一 ~ 周五)
# 获取每个月第一个周四
pd.date_range('2024-04-01', '2024-06-30', freq='WOM-1Thu') # week of month, Thursday: 周四
# 获取每个月第三个周五
pd.date_range('2024-04-01', '2024-06-30', freq='WOM-3Fri') # week of month
2.freq可以取的值
六、通过日期索引获取数据
1.获取特定日期的数据
# 查看某一天数据
data.loc['2014-06-29']
2.获取某段时间的数据
# 查看某一段时间data
# data.loc['2014-08-01':'2014-08-26'] # 包左包右.由于data数据时间索引列不是单调索引,所以这里报错
# data.loc['2014-08-02 18:51:00':'2014-08-04 17:12:00'] # 包左包右.
3.获取几点到几点的数据
# ?4. 查询凌晨 2点 到 5点的 data.
data.between_time('02:00', '05:00') # 包左包右, 29229条
data.between_time('02:00', '05:00', inclusive='left') # 包左不包右, 29078条
data.between_time('02:00', '05:00', inclusive='neither') # 不包左不包右, 28736条
4.获取某一时刻的数据
# 5. 查看发生在某个时刻的data.
data.at_time('02:00') # 342条
以上全是基于我的数据哦,大家要自己尝试!
5.先将日期排序在获取
# 6. 按时间段来获取数据时, 可以将时间索引排序, 排序之后在选取, 效率更高.
# 排序前
crime
# 排序后
crime_sort = crime.sort_index()
crime_sort
# crime_sort.loc['2014-08-01':'2014-08-26'] # 验证,索引排完序后,loc不报错
这样可以解决小2的问题
6.查看执行代码效率
通过 %timeit 可以查看 后续代码的执行效率.
# 假设: 获取 '2012-08-01' ~ '2015-08-26' 区间内的数据.
# %timeit crime.loc['2012-08-01':'2015-08-26'] # 4.44 ms ± 146 µs, 4.44毫秒 ± 146微秒
%timeit crime_sort.loc['2012-08-01':'2015-08-26'] # 1.11 ms ± 93.9 µs, 1.11毫秒 ± 93.9微秒
七、总结
- Pandas关于日期时间的数据 有如下几种数据类型
-
TimeDelta64 两列时间的差值 → TimeDeltaIndex
-
Datetime64 一列时间数据 →DatetimeIndex
-
TimeStamp 时间戳 就是一个时间点
-
如果数据中包含了日期时间的数据, 并且后续计算/数据的处理需要用到日期时间类型数据的特性需要把他转换成日期时间类型
-
pd.to_datetime(一列数据)
-
pd.read_csv(parse_dates= [列名/序号]) 加载的时候直接进行转换
-
-
还可以通过Pandas提供的API生成日期时间的序列
pd.date_range('起始时间','结束时间', freq= 生成时间序列的方式)
-
在特征处理/数据处理 看见日期时间类型数据需要马上反映出通过这一列数据,可以做出很多列特征来
-
df['Date'].dt.year 年
-
df['Date'].dt.month 月
-
df['Date'].dt.quarter 季度
-
df['Date'].dt.dayofweek 星期几
-
如果想快速的对日期进行切片/范围选取的操作, 可以把它转换成日期时间索引
-
-