• Pandas数据分析21——固定时间点和时间差


     参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


    pandas处理时间的对象有很多,分别表示不同的作用。

    本次介绍固定时间对象和时间长对象。

    还是先导入包

    1. import numpy as np
    2. import pandas as pd
    3. import datetime

    固定时间

    时间点对象的建立

    时间点就表示一个时刻的具体时间,比如现在是2022年8月10日16:31:56。

    时间对象的建立有很多方法。

    #使用 python 的 datetime 库,至少需要年月日

    datetime.datetime.now()

     #指定时间

    datetime.datetime(2022,8,10,10,5)

     #pandas 等第三方库都是在datetime建立时间对象的

    1. #pd.Timestamp() 是定义时间的主要函数,代替 python 中的 datetime.datetime 对象。
    2. pd.Timestamp(datetime.datetime(2020, 6, 8))

     #指定时间字符串

    1. pd.Timestamp('2012-05-01')
    2. # Timestamp('2012-05-01 00:00:00')
    3. pd.Timestamp('2017-01-01T12')
    4. # Timestamp('2017-01-01 12:00:00')

    #指定时间位置数字,可以依次定义 year, month, day,hour, minute, second, microsecond

    1. pd.Timestamp(2012, 5, 1)
    2. # Timestamp('2012-05-01 00:00:00')
    3. pd.Timestamp(2017, 1, 1, 12)
    4. # Timestamp('2017-01-01 12:00:00')
    5. pd.Timestamp(year=2017, month=1, day=1, hour=12)
    6. # Timestamp('2017-01-01 12:00:00')

    #解析时间戳

    1. pd.Timestamp(1513393355.5, unit='s') # 单位为秒
    2. # Timestamp('2017-12-16 03:02:35.500000')
    1. #指定时区
    2. pd.Timestamp(1513393355, unit='s', tz='US/Pacific')
    3. # Timestamp('2017-12-15 19:02:35-0800', tz='US/Pacific')
    4. # 指定为北京时间
    5. pd.Timestamp(1513393355, unit='s', tz='Asia/Shanghai')
    6. # Timestamp('2017-12-16 11:02:35+0800', tz='Asia/Shanghai')

     #特殊时间

    1. #以下可取得当前时间,从而可通过属性取到今天日期、年份等信息:
    2. pd.Timestamp('today')
    3. pd.Timestamp('now')
    4. # Timestamp('2022-08-10 10:11:56.532981')
    5. pd.Timestamp('today').date() # 只取日期

     #也可以计算出昨天、明天等信息:

    1. # 昨天
    2. pd.Timestamp('now')-pd.Timedelta(days=1)
    3. # Timestamp('2020-06-08 16:14:39.254365')
    4. # 明天
    5. pd.Timestamp('now')+pd.Timedelta(days=1)
    6. # Timestamp('2020-06-10 16:15:28.019039')
    7. # 当月初,一日
    8. pd.Timestamp('now').replace(day=1)
    9. # Timestamp('2020-06-01 16:15:28.019039')

     #时间限制

    1. #由于 Pandas 以纳秒粒度表示时间戳,因此可以使用64位整数表示的时间跨度限制为大约584年:
    2. pd.Timestamp.min
    3. # Timestamp('1677-09-21 00:12:43.145225')
    4. pd.Timestamp.max
    5. # Timestamp('2262-04-11 23:47:16.854775807')

    时间属性

     #一个具体的时间包含了非常丰富的信息,如年份、在周几、在几月、在哪个季度,需要我们进行属性的读取。

    1. #先创建一个时间
    2. time = pd.Timestamp('now')
    3. time

     #以下是丰富的时间属性:

    1. time.asm8 # 返回 numpy datetime64格式(以纳秒为单位)。
    2. #numpy.datetime64('2022-08-10T09:58:52.365676000')
    3. time.dayofweek # 1 周几,周一为0
    4. time.day_of_week # 同上
    5. time.dayofyear # 161, 一年的第几天
    6. time.day_of_year # 同上
    7. time.days_in_month # 30 当月有多少天
    8. time.daysinmonth # 30 同上
    9. time.freqstr # None, 周期字符
    10. time.is_leap_year # True 是否闰年,公历的
    11. time.is_month_end # False 是否当月最后一天
    12. time.is_month_start # False 是否当月第一天
    13. time.is_quarter_end # False 是否当季最后一天
    14. time.is_quarter_start # False 是否当季第一天
    15. time.is_year_end # 是否当年最后一天
    16. time.is_year_start # 是否当年第一天
    17. time.quarter # 2 当前季度数
    18. # 如指定会返回类似
    19. time.tz # None 当前时区别名
    20. time.week # 24 当年第几周
    21. time.weekofyear # 24 同上
    22. time.day # 9 日
    23. time.fold # 0
    24. time.freq # None 频度周期
    25. time.hour # 16
    26. time.microsecond # 890462
    27. time.minute # 46
    28. time.month # 6
    29. time.nanosecond # 0
    30. time.second # 59
    31. time.tzinfo # None
    32. time.value # 1591721219890462000
    33. time.year # 2020

    时间方法

    1. time = pd.Timestamp('now', tz='Asia/Shanghai')
    2. # Timestamp('2020-06-09 16:55:58.027896+0800', tz='Asia/Shanghai')
    3. #方法如下:
    4. # 转换为指定时区
    5. time.astimezone('UTC')
    6. # Timestamp('2020-06-09 08:55:58.027896+0000', tz='UTC')
    7. # 转换单位,向上舍入
    8. time.ceil('s') # 转为以秒为单位
    9. # Timestamp('2020-06-09 16:55:59+0800', tz='Asia/Shanghai')
    10. time.ceil('ns') # 转为以纳秒为单位
    11. time.ceil('d') # 保留日
    12. time.ceil('h') # 保留时
    13. # 转换单位, 为向下舍入
    14. time.floor('h') # 保留时
    15. # Timestamp('2020-06-09 17:00:00+0800', tz='Asia/Shanghai')
    16. # 类似四舍五入
    17. time.round('h') # 保留时
    1. # 返回星期名
    2. time.day_name() # 'Tuesday'
    3. # 月份名称
    4. time.month_name() # 'June'
    5. # 将时间戳规范化为午夜,保留tz信息。
    6. time.normalize()
    7. # Timestamp('2020-06-09 00:00:00+0800', tz='Asia/Shanghai')
    8. # 时间元素替换 datetime.replace,可处理纳秒。
    9. time.replace(year=2019) # 年份换为2019年
    10. # Timestamp('2019-06-09 17:14:44.126817+0800', tz='Asia/Shanghai')
    11. time.replace(month=8) # 月份换为8月
    12. # Timestamp('2020-08-09 17:14:44.126817+0800', tz='Asia/Shanghai')
    13. # 转为周期类型,将丢失时区
    14. time.to_period(freq='h') # 周期为小时
    15. # Period('2020-06-09 17:00', 'H')
    16. # 转为指定时区
    17. time.tz_convert('UTC') # 转为 utc 时间
    18. # Timestamp('2020-06-09 09:14:44.126817+0000', tz='UTC')
    19. # 本地化时区转换
    20. time = pd.Timestamp('now')
    21. time.tz_localize('Asia/Shanghai')
    22. # Timestamp('2020-06-09 17:32:47.388726+0800', tz='Asia/Shanghai')
    23. time.tz_localize(None) # 删除时区

    时间缺失值

    1. pd.Timestamp(pd.NaT)
    2. #参与计算
    3. pd.NaT+pd.Timestamp('20201001')

    .dt 时间访问器

    #对于时间序列数据,可以使用 s.dt.xxx 的形式来访问它们的属性和调用它们的方法:

    1. s = pd.Series(pd.date_range('2020-01-01', periods=3, freq='d'))
    2. s.dt.date
    3. s.dt.time
    4. s.dt.timetz
    5. s.dt.year
    6. s.dt.month
    7. s.dt.day
    8. s.dt.hour
    9. s.dt.minute
    10. s.dt.second
    11. s.dt.microsecond
    12. s.dt.nanosecond
    13. s.dt.week
    14. s.dt.weekofyear
    15. s.dt.dayofweek
    16. s.dt.weekday
    17. s.dt.dayofyear
    18. s.dt.quarter
    19. s.dt.is_month_start
    20. s.dt.is_month_end
    21. s.dt.is_quarter_start
    22. s.dt.is_quarter_end
    23. s.dt.is_year_start
    24. s.dt.is_year_end
    25. s.dt.is_leap_year
    26. s.dt.daysinmonth
    27. s.dt.days_in_month
    28. s.dt.tz
    29. s.dt.freq
    30. s.dt.to_period
    31. s.dt.to_pydatetime
    32. s.dt.tz_localize
    33. s.dt.tz_convert
    34. s.dt.normalize
    35. s.dt.strftime
    36. s.dt.round
    37. s.dt.floor
    38. s.dt.ceil
    39. s.dt.month_name
    40. s.dt.day_name
    41. s.dt.qyear
    42. s.dt.start_time
    43. s.dt.end_time
    44. s.dt.days
    45. s.dt.seconds
    46. s.dt.microseconds
    47. s.dt.nanoseconds
    48. s.dt.components
    49. s.dt.to_pytimedelta
    50. s.dt.total_seconds
    51. # 个别用法举例
    52. s.dt.tz_localize('UTC').dt.tz_convert('US/Eastern')
    53. s.dt.strftime('%Y/%m/%d')

    时长数据

    时间差

    和上面的时间点比起来,时间差就表示一个时间的长度,一天一小时这种时间差。

    #Timedelta 数据类型用来代表时间增量,两个固定时间相减会产生时差: 

    1. # 两个固定时间相减
    2. pd.Timestamp('2020-11-01 15') - pd.Timestamp('2020-11-01 14')
    3. # Timedelta('0 days 01:00:00')
    4. pd.Timestamp('2020-11-01 08') - pd.Timestamp('2020-11-02 08')
    5. # Timedelta('-1 days +00:00:00')

    #按以下格式传入字符串:

    1. # 一天
    2. pd.Timedelta('1 days')
    3. # Timedelta('1 days 00:00:00')
    4. pd.Timedelta('1 days 00:00:00')
    5. # Timedelta('1 days 00:00:00')
    6. pd.Timedelta('1 days 2 hours')
    7. # Timedelta('1 days 02:00:00')
    8. pd.Timedelta('-1 days 2 min 3us')
    9. # Timedelta('-2 days +23:57:59.999997'
    1. 用关键字参数指定时间:
    2. pd.Timedelta(days=5, seconds=10)
    3. # Timedelta('5 days 00:00:10')
    4. pd.Timedelta(minutes=3, seconds=2)
    5. # Timedelta('0 days 00:03:02')
    6. # 可以实现指定分钟有多少天,多少小时
    7. pd.Timedelta(minutes=3242)

     #使用带周期量的偏移量别名:

    1. # 一天
    2. pd.Timedelta('1D')
    3. # Timedelta('1 days 00:00:00')
    4. # 两周
    5. pd.Timedelta('2W')
    6. # Timedelta('14 days 00:00:00')
    7. # 一天2小时3分钟4秒
    8. pd.Timedelta('1D2H3M4S')

    #带单位的整型数字:

    1. # 一天
    2. pd.Timedelta(1, unit='d')
    3. # 100 秒
    4. pd.Timedelta(100, unit='s')
    5. # Timedelta('0 days 00:01:40')
    6. # 4 周
    7. pd.Timedelta(4, unit='w')
    8. # Timedelta('28 days 00:00:00')

    #Python内置的datetime.timedelta或者Numpy的np.timedelta64:

    1. # 一天10分钟
    2. pd.Timedelta(datetime.timedelta(days=1, minutes=10))
    3. # Timedelta('1 days 00:10:00')
    4. # 100纳秒
    5. pd.Timedelta(np.timedelta64(100, 'ns'))
    6. # Timedelta('0 days 00:00:00.000000100')

    # 负值 

    1. # 负值
    2. pd.Timedelta('-1min')
    3. # Timedelta('-1 days +23:59:00')
    4. # 空值,缺失值
    5. pd.Timedelta('nan')
    6. # NaT
    7. # pd.Timedelta('nat')
    8. # NaT

    #也可以用 DateOffsets (Day, Hour, Minute, Second, Milli, Micro, Nano) 来构建:

    1. pd.Timedelta(pd.offsets.Second(2))
    2. # Timedelta('0 days 00:00:02')
    3. #to_timedelta,可以直接生成单个时长数据:
    4. pd.to_timedelta('1 days 06:05:01.00003')
    5. # Timedelta('1 days 06:05:01.000030')
    6. pd.to_timedelta('15.5us')
    7. # Timedelta('0 days 00:00:00.000015')
    8. pd.to_timedelta(pd.offsets.Day(3))
    9. # Timedelta('3 days 00:00:00')
    10. pd.to_timedelta('15.5min')
    11. # Timedelta('0 days 00:15:30')
    12. pd.to_timedelta(124524564574835)
    13. # Timedelta('1 days 10:35:24.564574835')

    时长可以相加:

    1. pd.Timedelta(pd.offsets.Day(2)) + pd.Timedelta(pd.offsets.Second(2)) + pd.Timedelta('00:00:00.000123')
    2. # Timedelta('2 days 00:00:02.000123')

     #以下是一些操作示例:

    1. s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
    2. td = pd.Series([pd.Timedelta(days=i) for i in range(3)])
    3. df = pd.DataFrame({'A': s, 'B': td})
    4. df

    1. df['C'] = df['A'] + df['B']
    2. df

    df.dtypes


    时长属性

    1. tdt=pd.Timedelta('10 days 9 min 3 sec')
    2. tdt.days
    3. tdt.seconds
    4. tdt.value #(时间戳)

  • 相关阅读:
    【C++】多态
    计算机网络概述
    独立站卖家如何设置Facebook的重定向广告
    pytest 的使用===谨记
    HTTP状态码大全及分类
    列表的嵌套--Python
    解决异常 java.net.URISyntaxException: Illegal character in query at index
    Layui自定义列表多选
    Java自定义注解实现参数校验
    【华为OD机试真题 python】 比赛【2022 Q4 | 100分】
  • 原文地址:https://blog.csdn.net/weixin_46277779/article/details/126268957