Python学习笔记-数据分析-Pandas03—时间时期

这篇博客详细介绍了Pandas中关于时间序列的处理,包括datetime模块,Timestamp和to_datetime的使用,DatetimeIndex的时间戳索引,Period时期的创建与转换,以及时间序列的索引、切片和重采样操作。重点讨论了重采样的概念,如升采样和降采样,并给出了各种频率参数的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pandas的时间序列主要包括以下内容:
时间模块(datetime)、时刻数据(Timestamp)、时间戳索引(DatetimeIndex)、时期(Period)、时间序列的索引及切片和重采样。共6部分内容。
一、时间模块:datetime(datetime本身并不是pandas里的东西,其属于系统自带的模块。)
datetime主要包括datetime.date(), datetime.datetime(), datetime.timedelta()
日期解析方法:parser.parse
1、datetime.date(),是date的一个对象。通过today()方法来查看今天的日期。
today = datetime.date.today()
print(today)
# 通过type可以看出,today是datetim.date的类型。
print('today的类型是: \n:',type(today))
print('-------------------------------------')
# 可以通过str来转成字符串
print('将其转化成字符串: \n:', str(today))
print('-------------------------------------')
# 直接创建datetime.date,日期是2020年1月1日
# 年月日之间用逗号分隔,需要注意的是年月日必须填写,否则会报错。
date = datetime.date(2020,1,1)
print(date)

运行结果如下:

2018-12-02
today的类型是: 
: <class 'datetime.date'>
-------------------------------------
将其转化成字符串: 
: 2018-12-02
-------------------------------------
2020-01-01
2、datetime.datetim()是一个datetime对象。通过now()得到当前的时间,这个时间包括年月日时分秒
now = datetime.datetime.now()
print(now)
print('now的类型是: \n:', type(now))
print('-------------------------------------')
# 直接创建datetime.datetime,日期是2020年1月1日1点1分1秒
# 年月日时分秒之间用逗号分隔
time1 = datetime.datetime(2020,1,1,1,1,1)
print(time1)
print('-------------------------------------')
# 如果不写时分秒的话,会默认为0点0分0秒
time2 = datetime.datetime(2020,1,1)
print(time2)
print('-------------------------------------')
# datetime.datetime可以做减法
time3 = time1-time2
print('time1-time2后的结果是: \n', time3)
print('-------------------------------------')
# 需要注意的是time3的类型是datetime.timedelta也就是时间差,而不是datetime.datetime。
print('注意类型的: \n', type(time3))

运行结果如下:

2018-12-02 21:34:58.653732
now的类型是: 
: <class 'datetime.datetime'>
-------------------------------------
2020-01-01 01:01:01
-------------------------------------
2020-01-01 00:00:00
-------------------------------------
time1-time2后的结果是: 
 1:01:01
-------------------------------------
注意类型的: 
 <class 'datetime.timedelta'>
3、datetime.timedelta 时间差。用now()方法给t1赋值,也可以用today来赋值。
注意:pandas里也有时间差,后期会用的多一些。
t1 = datetime.datetime.now()
t2 = datetime.date.today()
# 设置t3为50天。
t3 = datetime.timedelta(50)
print('当前日期再过50天是什么日期: \n', t1+t3)
print('-------------------------------------')
print('50天前是什么日期: \n', t1-t3)
print('-------------------------------------')
print('当前日期再过50天是什么日期: \n', t2+t3)
print('-------------------------------------')
print('50天前是什么日期: \n', t2-t3)

# 设置t4为50天+1小时,1小时用3600秒来表示。
t4 = datetime.timedelta(50,3600)
print('当前日期再过50天1小时是什么日期: \n', t1+t4)
print('-------------------------------------')
print('50天1小时之前是什么日期: \n', t1-t4)

运行结果如下:

当前日期再过50天是什么日期: 
 2019-01-21 21:34:58.829102
-------------------------------------
50天前是什么日期: 
 2018-10-13 21:34:58.829102
-------------------------------------
当前日期再过50天是什么日期: 
 2019-01-21
-------------------------------------
50天前是什么日期: 
 2018-10-13
当前日期再过501小时是什么日期: 
 2019-01-21 22:34:58.829102
-------------------------------------
501小时之前是什么日期: 
 2018-10-13 20:34:58.829102
4、parser.parse字符串转换成日期
注意:parser是系统自带的模块。
from dateutil.parser import parse

date = '12-31-2018'
# 直接将str转化成datetime.datetime
t1 = parse(date)
print(t1,type(t1))
print('-------------------------------------')
print('t1的类型是: \n',type(t1))
print('-------------------------------------')
# 下面是各种格式的识别
# 如果输入的格式国际通用格式中,也就是日在月之前。可以通过dayfirst来设置
# 通过AM和PM来进行上午和下午的区别。
# 可以通过英文缩写来定义月份
# 注意:不支持中文!!
print(parse('2018-12-31'),'\n',
     parse('12/31/2018'),'\n',
     parse('31/12/2018', dayfirst = True),'\n',  
     parse('Nov 11, 2018 11:11:11 AM'))

运行结果如下:

2018-12-31 00:00:00 <class 'datetime.datetime'>
-------------------------------------
t1的类型是: 
 <class 'datetime.datetime'>
-------------------------------------
2018-12-31 00:00:00 
 2018-12-31 00:00:00 
 2018-12-31 00:00:00 
 2018-11-11 11:11:11
二、Pandas的时刻数据:Timestamp和to_datetime
单个时间数据用Timestamp,多个时间数据用to_datetime。
1、Timestamp() 是pandas的时间数据。
d1 = '2018-11-15 13:30:30'
# datetime可设置时分秒,如果不设置就默认是00:00:00
d2 = datetime.datetime(2018,11,16,16)
# Timestamp可直接识别任何时间格式的字符串。
t1 = pd.Timestamp(d1)
t2 = pd.Timestamp(d2)
print(t1)
print('t1的类型是:\n', type(t1))
print('-------------------------------------')
print(t2)
print('d2的类型是:\n', type(t2))

运行结果如下:

2018-11-15 13:30:30
t1的类型是:
 <class 'pandas._libs.tslib.Timestamp'>
-------------------------------------
2018-11-16 16:00:00
d2的类型是:
 <class 'pandas._libs.tslib.Timestamp'>
2、to_datetime()也是pandas的时间数据,但是和Timestamp有所不同的是,可以对多个时间进行转换。
个人理解:to_datetime和Timestamp的最大不同就是对于多时间数据的处理。
d1 = '2018-11-15 13:30:30'
d2 = datetime.datetime(2018,11,16,16)
t1 = pd.to_datetime(d1)
t2 = pd.to_datetime(d2)
print(t1)
print('t1的类型是:\n', type(t1))
print('-------------------------------------')
print(t2)
print('t2的类型是:\n', type(t2))
print('-------------------------------------')

# 定义多个时间
d3 = ['20181112','20181113','20181114']
# 通过to_datetime转换成时间数据。
t3 = pd.to_datetime(d3)
print(t3)
# 转换后的时间数据是DatetimeIndex类型。
print('t3的类型是:\n', type(t3))

运行结果如下:

2018-11-15 13:30:30
t1的类型是:
 <class 'pandas._libs.tslib.Timestamp'>
-------------------------------------
2018-11-16 16:00:00
t2的类型是:
 <class 'pandas._libs.tslib.Timestamp'>
-------------------------------------
DatetimeIndex(['2018-11-12', '2018-11-13', '2018-11-14'], dtype='datetime64[ns]', freq=None)
t3的类型是:
 <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
2.1 to_datetime多时间数据处理说明
d1 = [datetime.datetime(2018,11,1),datetime.datetime(2018,11,2),datetime.datetime(2018,11,3),
      datetime.datetime(2018,11,4),datetime.datetime(2015,11,5)]
d2 = ['2018-5-1','2018-5-2','2018-5-3','2018-5-4','2018-5-5','2018-5-6']
print(d1)
print('-------------------------------------')
print(d2)
print('-------------------------------------')
# 直接将datetime类型和字符串类型都转成时间。类型是DatetimeIndex
t1 = pd.to_datetime(d1)
t2 = pd.to_datetime(d2)
print(t1)
print('-------------------------------------')
print(t2)
print('-------------------------------------')

# 如果一组时间数据中有非时间格式的数据,可用errors参数。并且不加errors参数的话,代码运行时会报错。
d3 =['2018-5-1','2018-5-2','2018-5-3','Hello Python!!!','2018-5-5','2018-5-6']
# 当errors = ignore 表示当发现非时间类型的数据时,依然按原数据显示。
t3 = pd.to_datetime(d3, errors = 'ignore')
print('注意Hello Python!!!: \n', t3)
print('注意类型不是DatetimeIndex了,而是numpy的数组: \n', type(t3))
print('-------------------------------------')
# 当errors = coerce 表示将非时间类型的数据用失值返NaT(Not a Time)代替。
t4 = pd.to_datetime(d3, errors = 'coerce')
print('注意Hello Python!!!已经被NaT代替了: \n', t4)
print('类型是DatetimeIndex: \n', type(t4))
print('-------------------------------------')

运行结果如下:

[datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 2, 0, 0), datetime.datetime(2018, 11, 3, 0, 0), datetime.datetime(2018, 11, 4, 0, 0), datetime.datetime(2015, 11, 5, 0, 0)]
-------------------------------------
['2018-5-1', '2018-5-2', '2018-5-3', '2018-5-4', '2018-5-5', '2018-5-6']
-------------------------------------
DatetimeIndex(['2018-11-01', '2018-11-02', '2018-11-03', '2018-11-04',
               '2015-11-05'],
              dtype='datetime64[ns]', freq=None)
-------------------------------------
DatetimeIndex(['2018-05-01', '2018-05-02', '2018-05-03', '2018-05-04',
               '2018-05-05', '2018-05-06'],
              dtype='datetime64[ns]', freq=None)
-------------------------------------
注意Hello Python!!!: 
 ['2018-5-1' '2018-5-2' '2018-5-3' 'Hello Python!!!' '2018-5-5' '2018-5-6']
注意类型不是DatetimeIndex了,而是numpy的数组: 
 <class 'numpy.ndarray'>
-------------------------------------
注意Hello Python!!!已经被NaT代替了: 
 DatetimeIndex(['2018-05-01', '2018-05-02', '2018-05-03', 'NaT', '2018-05-05',
               '2018-05-06'],
              dtype='datetime64[ns]', freq=None)
类型是DatetimeIndex: 
 <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
-------------------------------------
三、Pandas时间戳索引:DatetimeIndex
说明:这里说的时间戳索引指得就是DatetimeIndex。而不是对DatetimeIndex的索引。
DatetimeIndex(时间戳索引)和TimeSeries(时间序列)
# 定义一个DatetimeIndex类型的数据,生成DatetimeIndex可以是字符串也可以是datetime.datetime
# 注意: 单个时间戳的类型是Timestamp,而多个时间戳是DatetimeIndex
dti = pd.DatetimeIndex(['2018/12/12','2018/12/13','2018/12/14','2018/12/15','2018/12/16'])
print('这是dti: \n', dti,'\n','这是dti的类型: \n', type(dti))
print('-------------------------------------')

# 注意和多个时间戳类型的区别。
print('这是dti的第一个元素是: \n', dti[0],'\n','这是dti的第一个元素的类型是: \n',type(dti[0]))
print('-------------------------------------')

# 定义TimeSeries
# 说明:以DatetimeIndex为index索引的Series,就是TimeSeries。

# 通过pd.Series定义个Series,但是它的index用的是DatetimeIndex。st就变成了TimeSeries类型。
ts = pd.Series(np.random.rand(len(dti)), index = dti)
print('这是ts,注意!这个数据的索引是: \n', ts)
print('-------------------------------------')
print('这是ts的类型: \n', type(ts))
print('-------------------------------------')
print('这是ts索引的类型: \n', ts.index)

运行结果如下:

这是dti: 
 DatetimeIndex(['2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15',
               '2018-12-16'],
              dtype='datetime64[ns]', freq=None) 
 这是dti的类型: 
 <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
-------------------------------------
这是dti的第一个元素是: 
 2018-12-12 00:00:00 
 这是dti的第一个元素的类型是: 
 <class 'pandas._libs.tslib.Timestamp'>
-------------------------------------
这是ts,注意!这个数据的索引是: 
 2018-12-12    0.243206
2018-12-13    0.888690
2018-12-14    0.209546
2018-12-15    0.361329
2018-12-16    0.484417
dtype: float64
-------------------------------------
这是ts的类型: 
 <class 'pandas.core.series.Series'>
-------------------------------------
这是ts索引的类型: 
 DatetimeIndex(['2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15',
               '2018-12-16'],
              dtype='datetime64[ns]', freq=None)
1、pd.date_range() 生成时间数据
说明:对于时间数据的生产有多种方式,可以直接写,可以读取,也可以通过pd.date_range()来生成数据。
# date_rang()提供了两种生成方式:1、start + end; 2、start/end + periods 。
# pd.date_range(start=None, end=None, periods=None, freq='D', tz=None, 
#               normalize=False, name=None, closed=None, **kwargs)

# 参数说明:
# start:开始时间
# end:结束时间
# periods:偏移量

# 设置来开始和结束的时间,其他参数都是默认。
dr1 = pd.date_range('12/1/2018','12/10/2018')

# 设置开始时间并设置了10天的偏移量,这样就会从 '12/1/2018'到'12/10/2018'。也就说定义了向后10天的偏移量。
dr2 = pd.date_range(start = '12/1/2018', periods = 10)

# 设置了结束时间并设置了10天的偏移量,而且还增加了时分秒。因为设置了结束时间,所以偏移量是向前。而不是向后。
dr3 = pd.date_range(end = '12/31/2017 15:00:00', periods = 10)  
print(dr1)
print('类型是:',type(dr1))
print('-------------------------------------')
print(dr2)
print('类型是:',type(dr2))
print('-------------------------------------')
print(dr3)
print('类型是:',type(dr3))
print('-------------------------------------')

# normalize:将时分秒设置为00:00:00。该参数默认是False,如果设置为True就变成00:00:00
# name:给索引对象起个名字。下面的例子就是给dr4这个DatetimeIndex起了个名字叫‘hello Python!’
dr4 = pd.date_range(start = '12/1/2018 13:31:13', periods = 10, 
                    name = 'hello Python!', normalize = True)
print('注意时分秒的变化,变为00:00:00的时候,就不显示时分秒了: \n', dr4)
print('-------------------------------------')

# closed:默认为None,这种情况是末端包含的。left:左包含右不包含,right:左不包含右包含
# 
dr5 = pd.date_range('2018-12-01','2018-12-10',closed = 'left')
print('包含12-01,不包含12-10:\n',dr5)
print('-------------------------------------')
dr6 = pd.date_range('2018-12-01','2018-12-10',closed = 'right')
print('不包含12-01,包含12-10:\n',dr6)
print('-------------------------------------')

# freq:频率,默认天,pd.date_range()默认频率为日历日,pd.bdate_range()默认频率为工作日
dr7 = pd.date_range('12/1/2018','12/10/2018')
print('日历日: \n',dr7)
print('-------------------------------------')
dr8 = pd.bdate_range('12/1/2018','12/10/2018')
print('工作日: \n',dr8)
print('-------------------------------------')

# 通过list()将时间戳索引进行转换。
# 列表中的元素都是Timestamp,也就说Timestamp是pd里最小的时间刻度单位。
# 注意:Timestamp和DatetimeIndex的区别。
dr9 = list(pd.date_range(start = '2018-12-1',end = '2018-12-5'))
print('列表中的每个元素都是Timestamp: \n', dr9)

运行结果如下:

DatetimeIndex(['2018-12-01', '2018-12-02', '2018-12-03', '2018-12-04',
               '2018-12-05', '2018-12-06', '2018-12-07', '2018-12-08',
               '2018-12-09', '2018-12-10'],
              dtype='datetime64[ns]', freq='D')
类型是: <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
-------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值