zoukankan      html  css  js  c++  java
  • Python基础 | 日期时间操作

    “日期时间数据”作为三大基础数据类型之一,在数据分析中会经常遇到。
    本文总结Python中常见的日期时间操作。

    日期时间操作会涉及到的工具包:

    import datetime
    import calendar
    import time
    import pandas as pd
    

    获取时间

    # 当前日期
    today = datetime.date.today()
    
    # 当前日期时间
    now = datetime.datetime.now()
    now_2 = datetime.datetime.today()
    
    print(today)
    print(now)
    print(now_2)
    

    输出:
    2019-12-30
    2019-12-30 11:50:14.037643
    2019-12-30 11:50:14.037676

    时间映射

    # 日期
    # 获取对应的,年,月,日
    print(today.year,today.month,today.day)
    

    输出:
    2019 12 30

    # 时间对应的:时、分、秒
    print(now.hour,now.minute,now.second)
    

    输出:
    11 50 14

    # 获取对应的周信息
    # 返回:年份,第几周,星期几
    today.isocalendar()
    

    输出:
    (2020, 1, 1)

    # 直接获取星期几
    today.isoweekday()
    

    输出:
    1

    # 给定月份,返回当月第一天的星期以及最后一天
    calendar.monthrange(2019,9)
    

    输出:
    (6, 30)

    # 本周第一天
    today = datetime.date.today()
    today - datetime.timedelta(days=today.weekday()) 
    # weekday方法返回的是以星期日为起点的第几天
    

    输出:
    datetime.date(2019, 12, 30)

    # 本周最后一天
    today + datetime.timedelta(days=7-today.isoweekday()) 
    # isoweekday方法是我们平常见到的星期几
    

    输出:
    datetime.date(2020, 1, 5)

    格式转换

    字符串转日期

    # 字符串转日期
    # 默认是转成日期时间格式
    # 如果要获得日期,可以在日期时间格式的基础上加.date()
    
    day_str = '2019-08-01'
    day_time = datetime.datetime.strptime(day_str,'%Y-%m-%d')
    print(day_time)
    
    day_date = day_time.date()
    print(day_date)
    

    输出:
    2019-08-01 00:00:00
    2019-08-01

    time_str = '2019-08-01 11:01:33'
    time_time = datetime.datetime.strptime(time_str,'%Y-%m-%d %H:%M:%S')
    print(time_time)
    
    time_date = time_time.date()
    print(time_date)
    

    输出:
    2019-08-01 11:01:33
    2019-08-01

    # 其他格式
    date_str = '2019/8/3'
    date_date = datetime.datetime.strptime(date_str,'%Y/%m/%d')
    print(date_date)
    
    date_str = '2019.8.3'
    date_date = datetime.datetime.strptime(date_str,'%Y.%m.%d')
    print(date_date)
    

    输出:
    2019-08-03 00:00:00
    2019-08-03 00:00:00

    日期转字符串

    str(today)
    

    输出:
    '2019-12-30'

    str(now)
    

    输出:
    '2019-12-30 11:50:14.037643'

    datetime.datetime.strftime(now,'%Y-%m-%d')
    

    输出:
    '2019-12-30'

    datetime.datetime.strftime(now,'%Y-%m-%d %H:%M:%S')
    

    输出:
    '2019-12-30 11:50:14'

    unixtime

    # 日期时间转unixtime
    time.mktime(today.timetuple())
    

    输出:
    1577635200.0

    time.mktime(now.timetuple())
    

    输出:
    1577677814.0

    # unix time 转正常日期时间格式
    # unix time 是指从1970.1.1起至今的总秒数
    # 通常都是10位整数,如果是11位的话,那就是2286年以后的事情了
    datetime.datetime.fromtimestamp(10000000000)
    

    输出:
    datetime.datetime(2286, 11, 21, 1, 46, 40)

    # 如果你看到unix time超过10位数,就意味着后面的单位是毫秒或者更细的颗粒度
    # 通常到秒级就可以,这个时候可以截取前10位整数来转化得到对应的日期时间
    time_unix = 1577635200.0
    datetime.datetime.fromtimestamp(time_unix)
    

    输出:
    datetime.datetime(2019, 12, 30, 0, 0)

    # unix time 是指从1970.1.1起至今的总秒数
    # 不过你会发现直接减出来的秒数和用time.mktime方法得到的会不一样
    # 这是因为中国的时区需要偏移8个小时,也就是8*3600s
    (today - datetime.date(1970, 1, 1)).total_seconds() - time.mktime(today.timetuple())
    

    输出:
    28800.0

    28800/3600
    

    输出:
    8.0

    时间计算

    时间偏移

    # 使用datetime.timedelta()方法
    # timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
    # 计算操作符可+可-,后面的时间单位也可正可负
    
    now + datetime.timedelta(days=1)
    

    输出:
    datetime.datetime(2019, 12, 31, 10, 29, 51, 213734)

    now + datetime.timedelta(days=-1)
    

    输出:
    datetime.datetime(2019, 12, 29, 10, 29, 51, 213734)

    pandas 生成时间
    date_range(start=None, end=None, periods=None, freq=None, tz=None)

    • start : str or datetime-like, optional
      Left bound for generating dates.
    • end : str or datetime-like, optional
      Right bound for generating dates.
    • periods : integer, optional
      Number of periods to generate.
    • freq : str or DateOffset, default 'D'
      Frequency strings can have multiples, e.g. '5H'. See
      :ref:here <timeseries.offset_aliases> for a list of
      frequency aliases.
    • tz : str or tzinfo, optional
    # 间隔的频率,可以是天 'D'
    pd.date_range(start = '2020-1-1',freq='D',periods=3)
    

    输出:
    DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq='D')

    # 也可以是小时 H
    pd.date_range(start = '2020-1-1',freq='H',periods=3)
    

    输出:
    DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 01:00:00', '2020-01-01 02:00:00'], dtype='datetime64[ns]', freq='H')

    # 可以间隔多天
    pd.date_range(start = '2020-1-1',freq='2D',periods=3)
    

    输出:
    DatetimeIndex(['2020-01-01', '2020-01-03', '2020-01-05'], dtype='datetime64[ns]', freq='2D')

    # 也可以间隔多个小时
    pd.date_range(start = '2020-1-1',freq='6H',periods=3)
    

    输出:
    DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 06:00:00', '2020-01-01 12:00:00'], dtype='datetime64[ns]', freq='6H')

    # 还可以混合
    pd.date_range(start = '2020-1-1',freq='2D6H',periods=3)
    

    输出:
    DatetimeIndex(['2020-01-01 00:00:00', '2020-01-03 06:00:00', '2020-01-05 12:00:00'], dtype='datetime64[ns]', freq='54H')

    pd.date_range(start = '2020-1-1',freq='Q',periods=3)
    

    输出:
    DatetimeIndex(['2020-03-31', '2020-06-30', '2020-09-30'], dtype='datetime64[ns]', freq='Q-DEC')

    时间差

    time_next = now + datetime.timedelta(weeks=3)
    
    time_gap = time_next-now
    
    # 时间差的天数,总秒数
    print(time_gap.days,time_gap.total_seconds())
    

    输出:
    21 1814400.0

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    转载请注明作者及出处

  • 相关阅读:
    三、linux系统管理
    二、基本命令
    一、基本环境
    mysql-day4
    mysql-day3
    mysql-day2
    mysql-day1
    3、线性表的链式存储结构
    2、线性表之顺序表
    1、时间复杂度
  • 原文地址:https://www.cnblogs.com/dataxon/p/12533294.html
Copyright © 2011-2022 走看看