4.3 转换与处理时间数据

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))

在这里插入图片描述
频率参数:freq
默认freq = ‘D’:每日历日
B:每工作日
H:每小时
T/MIN:每分
S:每秒
L:每毫秒(千分之一秒)
U:每微秒(百万分之一秒)
W-MON:从指定星期几开始算起,每周
星期几缩写:MON/TUE/WED/THU/FRI/SAT/SUN
WOM-2MON:每月的第几个星期几开始算,这里是每月第二个星期一
M:每月最后一个日历日
MS:每月第一个日历日
Q-月:指定月为季度末,每个季度末最后一月的最后一个日历日
月缩写:JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC
所以Q-月只有三种情况:1-4-7-10,2-5-8-11,3-6-9-12
QS-月:指定月为季度末,每个季度末最后一月的第一个日历日
A-月:每年指定月份的最后一个日历日
AS-月:每年指定月份的第一个日历日
BM:每月最后一个工作日
BMS:每月第一个工作日
BQ-月:指定月为季度末,每个季度末最后一月的最后一个工作日
BQS-月:指定月为季度末,每个季度末最后一月的第一个工作日
BA-月:每年指定月份的最后一个工作日
BAS-月:每年指定月份的第一个工作日

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/1FPQFA8JJHuezxbpQIHiZ4Q
提取码: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())

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清木!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值