1. datetime
模块
- 引入:
from datetime import datetime
now = datetime.now(), now.year, now.month, now.day, now.second, now.minute
now属性
2. timedelta
时间差模块
- (没有使用时间差模块,单纯的两个日期之差)时间差
delta
:timedelta = datetime(2020, 10, 5) - datetime(2020, 10, 1)
,delta
属性:timedelta.days, timedelta.seconds
- 引入时间差
from datetime import timedelta
datetime(2020, 10, 5) + 2 * timedelta(5)
当前日期加上两倍时间差后日期
3. 日期和字符串
3.1 日期 --> 字符
str( datetime(2020, 10, 5) )
- 以特定格式 转换为字符串:
date.strftime( '%Y-%m-%d' )
格式符号定义图:
3.2 字符串 --> 日期
str_date = '2020-10-10'
,datetime.strptime( str_date, '%Y-%m-%d' )
以和字符串相应格式转化为日期,此时如果为'%Y/%m'
就会出错,需要完全一致- 对字符串列表转化:
str_dates = ['2020-10-10', '2020-10-11']
[ datetime.strptime(x, '%Y-%m-%d') for x in str_dates ]
4. 万能日期转化dateutil.parse
from dateutil.parse import parse
可以解析绝大多数人类所能理解的日期形式parse('Jan 31, 1997 10:45 PM')
parse('2011-01-03')
parse('6/12/2011', dayfirst=True)日在前月在后
5. 时间日期的创建
5.1 方式一:直接列表创建
dates = [
datetime(2011, 1, 2), datetime(2011, 1, 5),
datetime(2011, 1, 7), datetime(2011, 1, 8),
datetime(2011, 1, 10), datetime(2011, 1, 12)
]
5.2 方式二:pd.date_range(start=, end= , period=, freq= )
dates = pd.date_range('2020-10-1', end='2021-10-9', freq='3m') # 定义每3个月显示一次日期,可以指定y,m,w,d,s
dates = pd.date_range('2020-10-1', end='2021-10-9', periods=12) # 等分日期12份
dates = pd.date_range('2020-10-1', periods=10, freq='3d') # 每三天一个周期显示10次日期,可以没有end,但是默认freq为d,
时间序列频率:
6. 对日期索引的查看
6.1 对日期直接查看
所有查看方式对DateFrame
格式也有效,df.loc[ '2020' ]
- 一:严格根据日期索引查看:
stamp = ts.index[2], ts[stamp]
- 二:直接传入可以解释为日期的字符串:
ts['1/10/2020'], ts['2020/10/10']
- 三:切片查看一段时期:
long_ts = pd.Series(np.random.randn(15), index=dates)
2020-10-31 1.443782
2021-01-31 1.381629
2021-04-30 -0.027529
2021-07-31 -0.595590
2021-10-31 0.082549
2022-01-31 0.065526
2022-04-30 0.892626
2022-07-31 -0.444155
2022-10-31 1.860078
2023-01-31 0.836876
2023-04-30 -0.965845
2023-07-31 -1.753131
2023-10-31 0.676550
2024-01-31 0.211722
2024-04-30 0.077153
long_ts['2021'] # 可以查看一段日期,2021全年的日期
long_ts[ datetime(2023, 1,1): ] # 日期切片,查看2023年1.1后所有日期,通过时间格式查看
long_ts[ '20210401':'2023' ] # 日期切片,查看2021年4.1到2023年的所有日期,通过字符串查看
6.2 对日期聚合后查看
- 对日期重复的数据进行聚合查看在groupby中传入level=0:
duplicate_date = df.groupby(level = 0)
,然后duplicate_date.mean(), duplicate_date.count()
, 查看具体:duplicate_date.pad()
resample()
对一段时期聚合分组:group = long_ts.resample('y')
,查看具体group.pad()
,计算统计group.sum()
- 根据时间间隔划分样例计算出结果:
crimes = crime.resample('10Y').sum()
7. 对日期平移
- 对所有日期全部都增减一段时间:比如有时候自动识别年时,将64识别为2064,实际为1964,需要统一平移100年:
df.shift( -100, freq='y' )
,shift( +/-时间, 单位 )
,造成对日期识别问题原因是:时间的范围
In [92]: pd.Timestamp.min
Out[92]: Timestamp('1677-09-21 00:12:43.145225')
In [93]: pd.Timestamp.max
Out[93]: Timestamp('2262-04-11 23:47:16.854775807')
pd.to_datetime( arg, format='%Y-%m-%d' , errors=, )
第一个传入的参数arg
可以为:int, float, str, datetime, list, tuple, 1-d array, Series, DataFrame/dict-like
- 对datetime格式定义
pd.to_datetime('13000101', format='%Y%m%d', errors='ignore')
datetime.datetime(1300, 1, 1, 0, 0)
pd.to_datetime('13000101', format='%Y%m%d', errors='coerce')
NaT
# 出现情况的原因还是对日期的定义节点上,第一个可以忽略这种错误,第一个严格值守
In [92]: pd.Timestamp.min
Out[92]: Timestamp('1677-09-21 00:12:43.145225')
In [93]: pd.Timestamp.max
Out[93]: Timestamp('2262-04-11 23:47:16.854775807')