Python pandas,转换与处理时间序列数据

pandas库继承了NumPy库的datetime64以及timedelta64模块,能够快速实现时间字符串的转换、信息提取和时间运算。

转换字符串为标准时间

pandas时间相关的类
类名称 说明
Timestamp 最基础的时间类。表示某个时间点。绝大多数时间数据都是Timestamp形式
Timedelta 表示不同单位的时间,例如1d、1.5h、3min、4s等,而非具体的某个时间段
TimedeltaIndex 一组Timedelta构成的Index,可以用来作为Serise(DataFrame的单列数据为一个Series)或者DataFrame的索引
Period 表示单个时间跨度,或某个时间段,例如某一天、某一小时等

DatetimeIndex

一组Timestamp构成的Index,可以用来作为Series或者DataFrame的索引。

PeriodtimeIndex

一组Period构成的Index,可以用来作为Series或者DataFrame的索引。

 

 

 

 

 

 

 

 

 

Timestamp类型

Ø其中Timestamp作为时间类中最基础的,也是最为常用的。在多数情况下,时间相关的字符串都会转换成为Timestamppandas提供了to_datetime函数,能够实现这一目标。(注意:读取的数据存在当前目录同级的data文件夹下)

import pandas as pd
#读取数据  更新表和登陆信息表
Log=pd.read_table('./data/Training_LogInfo.csv',sep=',',encoding='gbk')  #./当前目录
Update=pd.read_csv('./data/Training_Userupdate.csv',sep=',',encoding='gbk')
#print(Log)
#print(Update)

#  登陆表 转换字符串时间为标准时间
print('转换前时间类型:\n',Log['Listinginfo1'].dtypes)
Log['Listinginfo1']=pd.to_datetime(Log['Listinginfo1'])
print('转换后时间类型:\n',Log['Listinginfo1'].dtypes)
print(Log['Listinginfo1'])

输出结果:

转换前时间类型:
 object
转换后时间类型:
 datetime64[ns]
0        2014-03-05
1        2014-03-05
2        2014-03-05
3        2014-03-05
4        2014-03-05
5        2014-03-05
6        2014-03-05
7        2014-03-05
8        2014-03-05
9        2014-03-05
...
580550   2014-03-05
Name: Listinginfo1, Length: 580551, dtype: datetime64[ns]

Ø值得注意的是,Timestamp类型时间是有限制的

import pandas as pd
print('最小时间为:',pd.Timestamp.min)
print('最大时间为:',pd.Timestamp.max)

 

输出结果:

最小时间为: 1677-09-21 00:12:43.145225
最大时间为: 2262-04-11 23:47:16.854775807

DatetimeIndexPeriodIndex函数

  • 除了将数据字原始DataFrame中直接转换为Timestamp格式外,还可以将数据单独提取出来将其转换为DatetimeIndex或者PeriodIndex
  • DatetimeIndexPeriodIndex两者区别在日常使用的过程中相对较小,其中DatetimeIndex是用来指代一系列时间点的一种数据结构,而PeriodIndex则是用来指代一系列时间段的数据结构

参数名称

说明

data

接收array。表示DatetimeIndex的值。无默认。

freq

接收string。表示时间的间隔频率。无默认。

start

接收string。表示生成规则时间数据的起始点。无默认。

periods

表示需要生成的周期数目。无默认。

end

接收string。表示生成规则时间数据的终结点。无默认。 

tz

接收timezone。表示数据的时区。默认为None

name

接收intstring。默认为空。指定DatetimeIndex的名字。  

 

 

 

 

 

 

 

 

 

 

时间字符串转化为DatetimeIndexPeriodIndex(后面涉及提取DatetimeIndexPeriodIndex中的数据

dateIndex=pd.DatetimeIndex(Log['Listinginfo1'])
print('转换后的数据类型为:\n',type(dateIndex))



转换后的数据类型为:
 

转换为PeriodIndex的时候需要注意,需要通过freq参数指定时间间隔,常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒。两个函数可以用来转换数据还可以用来创建时间序列数据,其参数非常类似

periodIndex=pd.PeriodIndex(Log['Listinginfo1'],freq='S')
print('转换periodIndex后的数据类型为:\n',type(periodIndex))



转换后的数据类型为:
 

提取时间序列数据信息

Timestamp类常用属性

  • 在多数涉及时间相关的数据处理,统计分析的过程中,需要提取时间中的年份,月份等数据。使用对应的Timestamp类属性就能够实现这一目的 
  • 结合Python列表推导式,可以实现对DataFrame某一列时间信息数据的提取。 

属性名称

说明

属性名称

说明

year

week

一年中第几周

month

quarter

day

weekofyear

一年中第几周

hour

小时

dayofyear

一年中的第几天

minute

分钟

dayofweek

一周第几天

second

weekday

一周第几天

date

日期

weekday_name

星期名称

time

时间

is_leap_year

是否闰年

 

 

 

 

 

 

 

 

 

提取数据:

#提取年份
year1=[i.year for i in Log['Listinginfo1']]
print('Listinginfo1中年份的前10个为:',year1[:10])
#提取月份
month1=[i.month for i in Log['Listinginfo1']]
print('Listinginfo1中月份的前10个为:',month1[:10])
#提取日期
day1=[i.day for i in Log['Listinginfo1']]
print('Listinginfo1中日期的前10个为:',day1[:10])
#一年中第几周
week_n=[i.week for i in Log['Listinginfo1']]
print('Listinginfo1中一年中第几周前10个为:',week_n[:10])

结果:

Listinginfo1中年份的前10个为: [2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014]
Listinginfo1中月份的前10个为: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
Listinginfo1中日期的前10个为: [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
Listinginfo1中一年中第几周前10个为: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]

DatetimeIndexPeriodIndex中提取信息

DatetimeIndexPeriodIndex中提取对应信息可以以类属性方式实现

值得注意的是PeriodIndex相比于DatetimeIndex少了weekday_name属性,所以不能够用该属性提取星期名称数据。若想要提取信息名称可以通过提取weekday属性,而后将0-6四个标签分别赋值为MondaySunday

#在DatetimeIndex和PeriodIndex中提取信息
print('dateIndex中星期名称的前5个为:\n',dateIndex.weekday_name[:5])
print('periodIndex中的星期名称的前5个为:\n',periodIndex.weekday[:5])

输出结果:

dateIndex中星期名称的前5个为:
 Index(['Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday'], dtype='object', name='Listinginfo1')
periodIndex中的星期名称的前5个为:
 Int64Index([2, 2, 2, 2, 2], dtype='int64', name='Listinginfo1')

加减时间数据

Timedelta

Timedelta是时间相关的类中的一个异类,不仅能够使用正数,还能够使用负数表示单位时间,例如1秒,2分钟,3小时等。使用Timedelta类,配合常规的时间相关类能够轻松实现时间的算术运算。目前Timedelta函数中时间周期中没有年和月。所有周期名称,对应单位及其说明如下表所示。

Python pandas,转换与处理时间序列数据_第1张图片

使用Timedelta ,可以很轻松地实现在某个时间上加减一段时间

#加运算  Timedelta
time1=Log['Listinginfo1']+pd.Timedelta(days=1)  #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("加一天后:\n",time1[:5])

#减运算  Timedelta
time2=Log['Listinginfo1']-pd.to_datetime('1995-12-4')  #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("减去1995-12-4后:\n",time2[:5])

结果:

0   2014-03-05
1   2014-03-05
2   2014-03-05
3   2014-03-05
4   2014-03-05
Name: Listinginfo1, dtype: datetime64[ns]
加一天后:
 0   2014-03-06
1   2014-03-06
2   2014-03-06
3   2014-03-06
4   2014-03-06
Name: Listinginfo1, dtype: datetime64[ns]
0   2014-03-05
1   2014-03-05
2   2014-03-05
3   2014-03-05
4   2014-03-05
Name: Listinginfo1, dtype: datetime64[ns]
减去1995-12-4后:
 0   6666 days
1   6666 days
2   6666 days
3   6666 days
4   6666 days
Name: Listinginfo1, dtype: timedelta64[ns]

除了使用Timedelta实现时间的平移外,还能够直接对两个时间序列进行相减,从而得出一个Timedelta

Update=pd.read_csv('./data/Training_Userupdate.csv',sep=',',encoding='gbk')
#更新表 转换字符串时间为标准时间
Update['ListingInfo1']=pd.to_datetime(Update['ListingInfo1'])
Update['UserupdateInfo2']=pd.to_datetime(Update['UserupdateInfo2'])
#用户更新表表中两时间序列差
Update_c=Update['ListingInfo1']-Update['UserupdateInfo2']
print(Update_c)

结果:

0         13 days
1         10 days
2          9 days
3          8 days
4          6 days
5          1 days
6         13 days
7         13 days
8         13 days
9         13 days
10        13 days
11        13 days
12        13 days
13        13 days
14        10 days
15         9 days
16         8 days
17         6 days
...
580549     0 days
580550     0 days
Length: 580551, dtype: timedelta64[ns]

整合后的代码:

#1.1 时间字符串和标准时间的转换方法

import pandas as pd
#读取数据  更新表和登陆信息表
Log=pd.read_table('./data/Training_LogInfo.csv',sep=',',encoding='gbk')  #./当前目录
Update=pd.read_csv('./data/Training_Userupdate.csv',sep=',',encoding='gbk')
#print(Log)
#print(Update)

# 登陆表 转换字符串时间为标准时间
print('转换前时间类型:\n',Log['Listinginfo1'].dtypes)
Log['Listinginfo1']=pd.to_datetime(Log['Listinginfo1'])
print('转换后时间类型:\n',Log['Listinginfo1'].dtypes)
print(Log['Listinginfo1'])

Log['LogInfo3']=pd.to_datetime(Log['LogInfo3'])
print(Log['LogInfo3'].dtypes)
print(Log['LogInfo3'])

#更新表 转换字符串时间为标准时间
Update['ListingInfo1']=pd.to_datetime(Update['ListingInfo1'])
Update['UserupdateInfo2']=pd.to_datetime(Update['UserupdateInfo2'])
print(Update['ListingInfo1'].dtypes)
print(Update['UserupdateInfo2'].dtypes)
print(Update['UserupdateInfo2'])
print(Update['ListingInfo1'])

#提取时间数据  登陆表
#提取年份
year1=[i.year for i in Log['Listinginfo1']]
print('Listinginfo1中年份的前10个为:',year1[:10])
#提取月份
month1=[i.month for i in Log['Listinginfo1']]
print('Listinginfo1中月份的前10个为:',month1[:10])
#提取日期
day1=[i.day for i in Log['Listinginfo1']]
print('Listinginfo1中日期的前10个为:',day1[:10])
#一年中第几周
week_n=[i.week for i in Log['Listinginfo1']]
print('Listinginfo1中一年中第几周前10个为:',week_n[:10])


#时间字符串转化为DatetimeIndex与PeriodIndex
dateIndex=pd.DatetimeIndex(Log['Listinginfo1'])
print('转换后的数据类型为:\n',type(dateIndex))

#转换为PeriodIndex的时候需要注意,需要通过freq参数指定时间间隔,
# 常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒
periodIndex=pd.PeriodIndex(Log['Listinginfo1'],freq='S')
print('转换periodIndex后的数据类型为:\n',type(periodIndex))

#在DatetimeIndex和PeriodIndex中提取信息
print('dateIndex中星期名称的前5个为:\n',dateIndex.weekday_name[:5])
print('periodIndex中的星期名称的前5个为:\n',periodIndex.weekday[:5])

#时间数据的算数运算
#加运算  Timedelta
time1=Log['Listinginfo1']+pd.Timedelta(days=1)  #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("加一天后:\n",time1[:5])

#减运算  Timedelta
time2=Log['Listinginfo1']-pd.to_datetime('1995-12-4')  #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("减去1995-12-4后:\n",time2[:5])

#用户登陆表中两时间序列差
Log_c=Log['Listinginfo1']-Log['LogInfo3']
print(Log_c)
#用户更新表表中两时间序列差
Update_c=Update['ListingInfo1']-Update['UserupdateInfo2']
print(Update_c)

#值得注意的是,Timestamp类型时间是有限制的。
print('最小时间为:',pd.Timestamp.min)
print('最大时间为:',pd.Timestamp.max)

 

你可能感兴趣的:(Python数据分析和可视化)