python 时间处理

在python中时间数据类型有date(日期)和time(时间)两种数据类型。
主要用到的模块包含,datetime,time以及calendar模块。

时间类型

import datetime as dt

now=dt.datetime.now()
print(now)

结果为
2016-10-05 09:11:28.301585

print(now.year,now.month,now.day)

结果为:
2016 10 5
我们也可以用datetime函数直接构造时间

print(dt.datetime(2010,5,6))

结果为:
2010-05-06 00:00:00

time=dt.date(2010,5,6)+dt.timedelta(18)
print(time)

结果为:
2010-05-24
这里timedelta表示时间差,用于时间加减运算。
下面是时间函数介绍

时间格式化

在python中,我们可以通过str以及strftime对时间数据进行格式化。

time=dt.date(2010,5,6)
print(str(time))
print(time.strftime('%y/%m/%d'))

结果为:
2010-05-06
10/05/06
这里str直接对时间进行字符串转换,而strftime则是把时间转换为固定格式
时间格式具体说明:

时间序列

通常情况下,我们的时间数据只是数据中的很小一部分内容,要配合其他数据一起使用,
这种情况下我们需要用到前面提到过的很多方法配合时间特有的函数一起使用才能起到事半功倍的效果。

time=pd.Series(np.random.randn(20),
           index=pd.date_range(dt.datetime(2016,1,1),periods=20))
print(time)

结果为:

接下来我们就可以正常数据一样多数据进行操作,比如索引、排序等

print(time[:2])

结果为:

print(time['2016-01-15'])

结果为:
1.29540896466

print(time['2016-01-15':'2016-01-20'])

结果为:

也可以用time['2016-01']对整个1月份的数据进行索引

重点说下pandas.date_range()这个函数
pandas.d 起始日期
end:为结束日期
perionds:输入时间范围
freq:时间间隔形式(年,月,日 )

data=pd.date_range('2010-01-01','2011-01-01',freq='M')
print(data)

结果为:
DatetimeIndex(['2010-01-31', '2010-02-28', '2010-03-31', '2010-04-30',
'2010-05-31', '2010-06-30', '2010-07-31', '2010-08-31',
'2010-09-30', '2010-10-31', '2010-11-30', '2010-12-31'],
dtype='datetime64[ns]', freq='M')

data=pd.date_range('2010-01-01',periods=5,freq='4D')
print(data)

结果为:
DatetimeIndex(['2010-01-01', '2010-01-05', '2010-01-09', '2010-01-13',
'2010-01-17'],
dtype='datetime64[ns]', freq='4D')
下面是详细的时间序列基础频率表

接下来看下时间偏移

data=pd.date_range('2010-01-01',periods=5,freq='2D')
print(data)

结果为:
DatetimeIndex(['2010-01-01', '2010-01-03', '2010-01-05', '2010-01-07',
'2010-01-09'],
dtype='datetime64[ns]', freq='2D')

print(data.shift(2))

结果为:
DatetimeIndex(['2010-01-05', '2010-01-07', '2010-01-09', '2010-01-11',
'2010-01-13'],
dtype='datetime64[ns]', freq='2D')
上面shift是对时间进行偏移,初始偏移量跟date_range的freq参数有关,如果shift自带freq,则使用自身参数。

print(data.shift(2,freq='D'))

结果为:
DatetimeIndex(['2010-01-03', '2010-01-05', '2010-01-07', '2010-01-09',
'2010-01-11'],
dtype='datetime64[ns]', freq='2D')

接下来我门口看下时间运算

timepieces=pd.Period('2005-01-01',freq='M')
print(timepieces+5)

结果为:
2005-06

print(pd.Period('2005-01-01','M')-pd.Period('2002-12-01','M'))

结果为:
25

timepieces=pd.Period('2005-01',freq='M')
print((timepieces+5).asfreq('D',how='start').strftime('%Y-%m-%d'))

结果为:
2005-06-01
通过asfreq对数据进行频率转换

time=pd.date_range('2000','2002',freq='M')
print(time)

结果为:
DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31', '2000-04-30',
'2000-05-31', '2000-06-30', '2000-07-31', '2000-08-31',
'2000-09-30', '2000-10-31', '2000-11-30', '2000-12-31',
'2001-01-31', '2001-02-28', '2001-03-31', '2001-04-30',
'2001-05-31', '2001-06-30', '2001-07-31', '2001-08-31',
'2001-09-30', '2001-10-31', '2001-11-30', '2001-12-31'],
dtype='datetime64[ns]', freq='M')

print(time.to_period().asfreq('D',how='start'))

结果为:
PeriodIndex(['2000-01-01', '2000-02-01', '2000-03-01', '2000-04-01',
'2000-05-01', '2000-06-01', '2000-07-01', '2000-08-01',
'2000-09-01', '2000-10-01', '2000-11-01', '2000-12-01',
'2001-01-01', '2001-02-01', '2001-03-01', '2001-04-01',
'2001-05-01', '2001-06-01', '2001-07-01', '2001-08-01',
'2001-09-01', '2001-10-01', '2001-11-01', '2001-12-01'],
dtype='int64', freq='D')
这里进行了两次转换,首先是类型转换,然后再进行频率转换

print(time.to_period().asfreq('M',how='start'))

结果为:
PeriodIndex(['2000-01', '2000-02', '2000-03', '2000-04', '2000-05', '2000-06',
'2000-07', '2000-08', '2000-09', '2000-10', '2000-11', '2000-12',
'2001-01', '2001-02', '2001-03', '2001-04', '2001-05', '2001-06',
'2001-07', '2001-08', '2001-09', '2001-10', '2001-11', '2001-12'],
dtype='int64', freq='M')

原文地址:https://www.cnblogs.com/wkslearner/p/5931959.html