Pandas时间日期处理总结

1. datetime模块

  • 引入:from datetime import datetime
  • now = datetime.now(), now.year, now.month, now.day, now.second, now.minutenow属性

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

格式符号定义图:

Pandas时间日期处理总结_第1张图片
Pandas时间日期处理总结_第2张图片

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,

时间序列频率:

Pandas时间日期处理总结_第3张图片

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

你可能感兴趣的:(数据分析查询手册,python,数据分析)