4.3 转换与处理时间数据
- 4.3.1 转换字符串时间为标准时间
- 1、Timestamp
- 2、DatetimeIndex或者PeriodIndex
- DatetimeIndex与PeriodIndex函数及其参数说明
- 4.3.2 提取时间序列数据信息
- Timestamp类常用属性及说明
- 4.3.3 加减时间数据
- Timedelta类周期名称、对应单位及其说明
- 4.3.4 任务实现
- 数据
- 全部代码
4.3.1 转换字符串时间为标准时间
在多数情况下,对时间类型数据进行分析的前提就是将原本为字符串的时间转换为标准时间类型。pandas继承了NumPy库和datetime库的时间相关模块,提供了6种时间相关的类。
1、Timestamp
Timestamp作为时间类中最基础的,也是最为常用的类型,在多数情况下,时间相关的字符串都会转换成为Timestamp。pandas提供了to_datetime函数,能够实现这一目标。
import pandas as pd
data = pd.read_csv('E:/Input/ptest.csv')
print(data['time'].head(3))
print(f"转换前:{data['time'].dtypes}")
data['time'] = pd.to_datetime(data['time']) # 转换为Timestamp类型
print(f"转换后:{data['time'].dtypes}")
print(data['time'].head(3))
# Timestamp类型的时间是有限制的
print("最小时间为:", pd.Timestamp.min)
print("最大时间为:", pd.Timestamp.max)
注意:Timestamp类型的时间是有限制的,最小时间为: 1677-09-21 00:12:43.145224193
最大时间为: 2262-04-11 23:47:16.854775807
2、DatetimeIndex或者PeriodIndex
除了将数据字原始DataFrame中直接转换为Timestamp格式外,还可以将数据单独提取出来将其转换为DatetimeIndex或者PeriodIndex。
转换为PeriodIndex的时候需要注意,需要通过freq参数指定时间间隔,常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒。两个函数可以用来转换数据还可以用来创建时间序列数据,其参数非常类似。
DatetimeIndex与PeriodIndex函数及其参数说明
DatetimeIndex和PeriodIndex两者区别在日常使用的过程中相对较小,其中DatetimeIndex是用来指代一系列时间点的一种数据结构,而PeriodIndex则是用来指代一系列时间段的数据结构。
# DatetimeIndex或者PeriodIndex
timeindex = pd.DatetimeIndex(data['time'])
# print(timeindex)
print("转换为DatetimeIndex后:", type(timeindex))
# 常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒
periodindex = pd.PeriodIndex(data['time'], freq='S')
# print(periodindex)
print("转换为PeriodIndex后:", type(periodindex))
4.3.2 提取时间序列数据信息
在多数涉及时间相关的数据处理,统计分析的过程中,需要提取时间中的年份,月份等数据,使用对应的Timestamp类属性就能够实现这一目的。
Timestamp类常用属性及说明
# 4.3.2 提取时间序列数据信息
y1 = [i.year for i in data['time']]
print(y1[:3]) # 打印年的前三个
m1 = [i.month for i in data['time']]
print(m1[:3]) # 打印月的前三个
d1 = [i.day for i in data['time']]
print(d1[:3]) # 打印日的前三个
h1 = [i.hour for i in data['time']]
print(h1[:3]) # 打印小时前三个
min1 = [i.minute for i in data['time']]
print(min1[:3]) # 打印分钟前三个
s1 = [i.second for i in data['time']]
print(s1[:3]) # 打印秒前三个
w1 = [i.week for i in data['time']] # 一年中第几个周
print(w1[:3]) # 打印前三个
days = [i.dayofyear for i in data['time']] # 一年的第几天
print(days[:3]) # 打印前三个
4.3.3 加减时间数据
pandas的时间数据和现实生活中的时间数据一样可以做运算,这时就涉及到pandas的Timedelta类。Timedelta是时间相关的类中的一个异类,不仅能够使用正数,还能够使用负数表示单位时间,例如1秒,2分钟,3小时等。使用Timedelta类,配合常规的时间相关类能够轻松实现时间的算术运算。
目前Timedelta函数中时间周期中没有年和月。所有周期名称,对应单位及其说明如下表所示。
Timedelta类周期名称、对应单位及其说明
# 4.3.3 加减时间数据
# 将data['time']数据往后移一天
time1 = data['time'] + pd.Timedelta(days=1)
print(data['time'][:3]) # 原始数据
print(time1[:3]) # 加上一天的数据
# 减
time2 = data['time'] - pd.to_datetime('2023-1-1')
print(time2[:3]) # 减去20223-1-1的数据
4.3.4 任务实现
# 4.3.4 任务实现
# 处理自己的数据
## 1、时间字符串转换为标准时间格式
print(data.head(3))
# data['timehm'] = pd.to_datetime(data['timehm'])
print(data['TIMESTAMP_START'].dtypes)
data['TIMESTAMP_START'] = pd.PeriodIndex(data['TIMESTAMP_START'], freq='T')
data['TIMESTAMP_END'] = pd.PeriodIndex(data['TIMESTAMP_END'], freq='T')
print(data.head(3))
## 2、提取数据中的年月日信息
y1 = [i.year for i in data['TIMESTAMP_START']]
print(y1[:3]) # 打印年的前三个
m1 = [i.month for i in data['TIMESTAMP_START']]
print(m1[:3]) # 打印月的前三个
d1 = [i.day for i in data['TIMESTAMP_START']]
print(d1[:3]) # 打印日的前三个
## 3、查看时间统计信息
print(data['TIMESTAMP_START'].min()) # 2005-09-28 16:30
print(data['TIMESTAMP_START'].max()) # 2005-09-30 17:00
print(data['TIMESTAMP_START'].max() - data['TIMESTAMP_START'].min()) # 持续时间 <2910 * Minutes>
t = data['TIMESTAMP_END'] - data['TIMESTAMP_START']
print(t)
print(t.min())
print(t.max())
数据
链接:https://pan.baidu.com/s/1AUBdK-MQfpRg8LhOpmKBkw
提取码:6666
全部代码
# 4.3 转换与处理时间序列数据
# 4.3.1 转换字符串时间为标准时间
import pandas as pd
import numpy as np
data = pd.read_csv('E:/Input/ptest.csv')
print(data['time'].head(3))
print(f"转换前:{data['time'].dtypes}")
# Timestamp类型
data['time'] = pd.to_datetime(data['time']) # 转换为Timestamp类型
print(f"转换后:{data['time'].dtypes}")
print(data['time'].head(3))
# Timestamp类型的时间是有限制的
print("最小时间为:", pd.Timestamp.min)
print("最大时间为:", pd.Timestamp.max)
# DatetimeIndex或者PeriodIndex
timeindex = pd.DatetimeIndex(data['time'])
# print(timeindex)
print("转换为DatetimeIndex后:", type(timeindex))
# 常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒
periodindex = pd.PeriodIndex(data['time'], freq='S')
# print(periodindex)
print("转换为PeriodIndex后:", type(periodindex))
# # 处理我自己的数据时要用到的转换
# print(data['TIMESTAMP_START'].dtypes)
# print(data['TIMESTAMP_START'])
# per = pd.PeriodIndex(data['TIMESTAMP_START'], freq='T')
# print(per)
# print("转换为PeriodIndex后:", type(per))
# 4.3.2 提取时间序列数据信息
y1 = [i.year for i in data['time']]
print(y1[:3]) # 打印年的前三个
m1 = [i.month for i in data['time']]
print(m1[:3]) # 打印月的前三个
d1 = [i.day for i in data['time']]
print(d1[:3]) # 打印日的前三个
h1 = [i.hour for i in data['time']]
print(h1[:3]) # 打印小时前三个
min1 = [i.minute for i in data['time']]
print(min1[:3]) # 打印分钟前三个
s1 = [i.second for i in data['time']]
print(s1[:3]) # 打印秒前三个
w1 = [i.week for i in data['time']] # 一年中第几个周
print(w1[:3]) # 打印前三个
days = [i.dayofyear for i in data['time']] # 一年的第几天
print(days[:3]) # 打印前三个
# 4.3.3 加减时间数据
# 将data['time']数据往后移一天
time1 = data['time'] + pd.Timedelta(days=1)
print(data['time'][:3]) # 加之前的数据
print(time1[:3]) # 加上一天的数据
# 减去一个日期‘2023-1-1’
time2 = data['time'] - pd.to_datetime('2023-1-1')
print(time2[:3]) # 减去2023-1-1的数据
# 4.3.4 任务实现
# 处理自己的数据
## 1、时间字符串转换为标准时间格式
print(data.head(3))
# data['timehm'] = pd.to_datetime(data['timehm'])
print(data['TIMESTAMP_START'].dtypes)
data['TIMESTAMP_START'] = pd.PeriodIndex(data['TIMESTAMP_START'], freq='T')
data['TIMESTAMP_END'] = pd.PeriodIndex(data['TIMESTAMP_END'], freq='T')
print(data.head(3))
## 2、提取数据中的年月日信息
y1 = [i.year for i in data['TIMESTAMP_START']]
print(y1[:3]) # 打印年的前三个
m1 = [i.month for i in data['TIMESTAMP_START']]
print(m1[:3]) # 打印月的前三个
d1 = [i.day for i in data['TIMESTAMP_START']]
print(d1[:3]) # 打印日的前三个
## 3、查看时间统计信息
print(data['TIMESTAMP_START'].min()) # 2005-09-28 16:30
print(data['TIMESTAMP_START'].max()) # 2005-09-30 17:00
print(data['TIMESTAMP_START'].max() - data['TIMESTAMP_START'].min()) # 持续时间 <2910 * Minutes>
t = data['TIMESTAMP_END'] - data['TIMESTAMP_START']
print(t)
print(t.min())
print(t.max())