zoukankan      html  css  js  c++  java
  • 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')
      
  • 相关阅读:
    python多版本与虚拟环境
    前端开发:基于cypress的自动化实践
    Selenium 4.0beta:读源码学习新功能
    Selenium 4.0beta: Grid 工作原理
    自己上手写性能工具(三)
    如何实现共享屏幕标注功能?
    资源下载网站
    修改tmux背景色
    使用nas唤醒其他PC主机
    2021.26 富兰克林效应
  • 原文地址:https://www.cnblogs.com/zwrAI/p/14258303.html
Copyright © 2011-2022 走看看