pandas组队学习:task10

一、时间戳

1. Timestamp的构造和属性

由pd.Timestamp实现,可以通过year, month, day, hour, min, second 可以获取具体的数值:

ts = pd.Timestamp('2020-1-1 08:10:30')
ts
Out[6]: Timestamp('2020-01-01 08:10:30')

ts.year
Out[7]: 2020

ts.month
Out[8]: 1

ts.day
Out[9]: 1

ts.hour
Out[10]: 8

ts.minute
Out[11]: 10

ts.second
Out[12]: 30

2.Datetime序列的生成

时间序列由一组时间戳组成,可以用 to_datetimedate_range 来生成

  • to_datetime

    直接对时间戳列表进行转换:

    pd.to_datetime(['2020-1-1', '2020-1-3', '2020-1-6'])
    Out[16]: DatetimeIndex(['2020-01-01', '2020-01-03', '2020-01-06'], dtype='datetime64[ns]', freq=None)
    

    时间戳格式不满足转换时,强制使用format进行匹配:

    temp = pd.to_datetime(['2020\\1\\1','2020\\1\\3'],format='%Y\\%m\\%d')
    temp
    Out[21]: DatetimeIndex(['2020-01-01', '2020-01-03'], dtype='datetime64[ns]', freq=None)
    

    如果想要转为 datetime64[ns] 的序列,需要显式用 Series 转化:

    pd.Series(temp).head()
    Out[22]: 
    0   2020-01-01
    1   2020-01-03
    dtype: datetime64[ns]
    

    如果输入时间戳是表的多个列,列名必须与时间关键词列名一致:

    df_date_cols = pd.DataFrame({'year': [2020, 2020],
       ....:                              'month': [1, 1],
       ....:                              'day': [1, 2],
       ....:                              'hour': [10, 20],
       ....:                              'minute': [30, 50],
       ....:                              'second': [20, 40]})
     
    pd.to_datetime(df_date_cols)
    Out[24]: 
    0   2020-01-01 10:30:20
    1   2020-01-02 20:50:40
    dtype: datetime64[ns]
    
  • date_range

    参数为 start, end, freq, periods ,它们分别表示开始时间,结束时间,时间间隔,时间戳个数。

    开始或者结束日期作为端点会被包含:

    pd.date_range('2020-1-1','2020-1-21', freq='10D') # 包含
    Out[25]: DatetimeIndex(['2020-01-01', '2020-01-11', '2020-01-21'], dtype='datetime64[ns]', freq='10D')
    

3.dt对象

在时序类型的序列上定义了 dt 对象来完成许多时间序列的相关操作。

  • 取出相关属性

    s = pd.Series(pd.date_range('2020-1-1','2020-1-3', freq='D'))
    
    In [33]: s.dt.date
    Out[33]: 
    0    2020-01-01
    1    2020-01-02
    2    2020-01-03
    dtype: object
    
    In [34]: s.dt.time
    Out[34]: 
    0    00:00:00
    1    00:00:00
    2    00:00:00
    dtype: object
    
    In [35]: s.dt.day
    Out[35]: 
    0    1
    1    2
    2    3
    dtype: int64
    
    In [36]: s.dt.daysinmonth
    Out[36]: 
    0    31
    1    31
    2    31
    dtype: int64
    
  • 判断操作主要用于测试是否为月/季/年的第一天或者最后一天:

    In [40]: s.dt.is_year_start # 还可选 is_quarter/month_start
    Out[40]: 
    0     True
    1    False
    2    False
    dtype: bool
    
    In [41]: s.dt.is_year_end # 还可选 is_quarter/month_end
    Out[41]: 
    0    False
    1    False
    2    False
    dtype: bool
    
  • 取整操作包含 round, ceil, floor ,它们的公共参数为 freq ,常用的包括 H, min, S (小时、分钟、秒)

    In [42]: s = pd.Series(pd.date_range('2020-1-1 20:35:00',
       ....:                             '2020-1-1 22:35:00',
       ....:                             freq='45min'))
       ....: 
    
    In [43]: s
    Out[43]: 
    0   2020-01-01 20:35:00
    1   2020-01-01 21:20:00
    2   2020-01-01 22:05:00
    dtype: datetime64[ns]
    
    In [44]: s.dt.round('1H')
    Out[44]: 
    0   2020-01-01 21:00:00
    1   2020-01-01 21:00:00
    2   2020-01-01 22:00:00
    dtype: datetime64[ns]
    
    In [45]: s.dt.ceil('1H')
    Out[45]: 
    0   2020-01-01 21:00:00
    1   2020-01-01 22:00:00
    2   2020-01-01 23:00:00
    dtype: datetime64[ns]
    
    In [46]: s.dt.floor('1H')
    Out[46]: 
    0   2020-01-01 20:00:00
    1   2020-01-01 21:00:00
    2   2020-01-01 22:00:00
    dtype: datetime64[ns]
    

4.时间戳的切片和索引

时间戳序列作为索引使用。如果想要选出某个子时间戳序列,第一类方法是利用 dt 对象和布尔条件联合使用,另一种方式是利用切片。

  • 利用dt对象

    In [47]: s = pd.Series(np.random.randint(2,size=366),
       ....:               index=pd.date_range(
       ....:                       '2020-01-01','2020-12-31'))
       ....: 
    
    In [48]: idx = pd.Series(s.index).dt
    
    In [49]: s.head()
    Out[49]: 
    2020-01-01    1
    2020-01-02    1
    2020-01-03    0
    2020-01-04    1
    2020-01-05    0
    Freq: D, dtype: int32
    
    In [50]: s[(idx.is_month_start|idx.is_month_end).values].head()		#每月的第一天或者最后一天
    Out[50]: 
    2020-01-01    1
    2020-01-31    0
    2020-02-01    1
    2020-02-29    1
    2020-03-01    0
    dtype: int32
    
  • 利用切片

    取出单日值:

    In [52]: s['2020-01-01']
    Out[52]: 1
    
    In [53]: s['20200101'] # 自动转换标准格式
    Out[53]: 1
    

    取出5月初至7月15日:

    In [55]: s['2020-05':'2020-7-15'].head()
    Out[55]: 
    2020-05-01    0
    2020-05-02    1
    2020-05-03    0
    2020-05-04    1
    2020-05-05    1
    Freq: D, dtype: int32
    

二、时间差

1.Timedelta的生成

可以由两个时间戳的差,或者pd.Timedelta生成:

In [57]: pd.Timestamp('20200102 08:00:00')-pd.Timestamp('20200101 07:35:00')
Out[57]: Timedelta('1 days 00:25:00')

In [58]: pd.Timedelta(days=1, minutes=25) # 需要注意加s
Out[58]: Timedelta('1 days 00:25:00')

In [59]: pd.Timedelta('1 days 25 minutes') # 字符串生成
Out[59]: Timedelta('1 days 00:25:00')

2.时间差序列的生成

  • pd.to_timedelta
In [60]: s = pd.to_timedelta(df.Time_Record)

In [61]: s.head()
Out[61]: 
0   0 days 00:04:34
1   0 days 00:04:20
2   0 days 00:05:22
3   0 days 00:04:08
4   0 days 00:05:22
Name: Time_Record, dtype: timedelta64[ns]
  • timedelta_range

    In [62]: pd.timedelta_range('0s', '1000s', freq='6min')
    Out[62]: TimedeltaIndex(['0 days 00:00:00', '0 days 00:06:00', '0 days 00:12:00'], dtype='timedelta64[ns]', freq='6T')
    
    In [63]: pd.timedelta_range('0s', '1000s', periods=3)
    Out[63]: TimedeltaIndex(['0 days 00:00:00', '0 days 00:08:20', '0 days 00:16:40'], dtype='timedelta64[ns]', freq=None)
    

3.Timedelta的运算

  • 生成时间戳和时间差:

    In [67]: td1 = pd.Timedelta(days=1)
    In [68]: td2 = pd.Timedelta(days=3)
    In [69]: ts = pd.Timestamp('20200101')
    
  • 与标量的乘法运算:

    In [70]: td1 * 2
    Out[70]: Timedelta('2 days 00:00:00')
    
  • 与时间戳的加减法运算:

    In [73]: ts - td1
    Out[73]: Timestamp('2019-12-31 00:00:00')
    
  • 与时间差的加减法与除法运算:

    In [71]: td2 - td1
    Out[71]: Timedelta('2 days 00:00:00')
    
    In [72]: ts + td1
    Out[72]: Timestamp('2020-01-02 00:00:00')
    
posted @ 2021-01-10 14:15  爱睡觉的皮卡丘  阅读(55)  评论(0编辑  收藏  举报