【python 時間】datetime、time、date

import time
import datetime
from dateutil.relativedelta import relativedelta
import pytz
import pandas as pd

國際時間、本地時間

"""
國際時間 和 本地時間
utc time: 國際時間(倫敦 格林威治時間)
lacaltime: 本地時間(北京時間)
"""
# 國際時間
time.gmtime() # time.struct_time(tm_year=2019, tm_mon=12, tm_mday=2, tm_hour=8, tm_min=49, tm_sec=17, tm_wday=0, tm_yday=336, tm_isdst=0)
datetime.datetime.utcnow() # datetime.datetime(2019, 12, 2, 8, 49, 47, 767980)
# 本地時間
time.localtime() # time.struct_time(tm_year=2019, tm_mon=12, tm_mday=2, tm_hour=16, tm_min=50, tm_sec=20, tm_wday=0, tm_yday=336, tm_isdst=0)
datetime.datetime.now() # datetime.datetime(2019, 12, 2, 16, 50, 36, 801288)

時間戳、時間數組、時間格式

# ========= 時間戳、時間數組、時間格式
# 時間戳(本地)-int
time.time() # Out[7]: 1575276680.5390034

# 時間數組-也稱爲時間元組
time_array = time.localtime() # localtime
time_array2 = time.gmtime() # utc time
print('本地時間數組:', time_array)
print('utc時間數組:', time_array2)
# 本地時間數組: time.struct_time(tm_year=2019, tm_mon=12, tm_mday=2, tm_hour=16, tm_min=53, tm_sec=40, tm_wday=0, tm_yday=336, tm_isdst=0)
# utc時間數組: time.struct_time(tm_year=2019, tm_mon=12, tm_mday=2, tm_hour=8, tm_min=53, tm_sec=40, tm_wday=0, tm_yday=336, tm_isdst=0)

# 日期格式-str
dt = time.strftime('%Y-%m-%d %H:%M:%S', time_array)
print('日期格式(str):', dt)
# 日期格式(str): 2019-12-02 16:53:40

# 1、時間戳轉日期(秒 -> 數組 -> 日期):  time.strftime()  類似 datetime.datetime.strftime()
s = 1540878671       # 單位: s; 也就是隻有10位數,超過將無法轉化
array = time.gmtime(s)
dt = time.strftime('%Y-%m-%d %H:%M:%S', array)
print("時間戳轉化的日期:", dt)
# 時間戳轉化的日期: 2018-10-30 05:51:11

# 2、日期轉時間戳(日期 -> 數組 -> 秒):  time.strptime()  類似 datetime.datetime.strptime()
dt = '2018-10-30 08:51:11'
array = time.strptime(dt, '%Y-%m-%d %H:%M:%S')
s = time.mktime(array)
print("日期轉化的時間戳:", s)
# 日期轉化的時間戳: 1540860671.0

分別獲取今天、昨天、上週、上月、去年的此刻時間

# ========= 分別獲取今天、昨天、上週、上月、去年的此刻時間
# 首先安裝: pip install python-dateutil

today = datetime.date.today()                                 # 今天
yesterday = today - datetime.timedelta(days=1)                # 昨天
Lastweek = today - datetime.timedelta(days=7)                 # 上週
Nearly_month = today - datetime.timedelta(days=30)            # 前30天
Last_month = datetime.date.today() - relativedelta(months=1)  # 上月
Last_year = datetime.date.today() - relativedelta(months=12)  # 去年

# 轉化爲日期格式(str):  datetime.date.strftime(Last_year, '%Y-%m-%d')
datetime.date.strftime(Last_year, '%Y-%m-%d')

def get_timestamp(type1, type2, days):
    # type: (str, str, int) -> int
    """給出指定日期的開始時間戳 或 結束時間戳(向前或者向後)
    
    :param type1: before or future.  before今天之前,future今天之後
    :param type2: start or end . 開始時間或結束時間的時間戳
    :param days: 天數,0--當天
    :return timestamp: timestamp
    """
    today = datetime.date.today()
 
    if type1 == 'before':
        target_day = today - datetime.timedelta(days=days)
    else:
        target_day = today + datetime.timedelta(days=days)
 
    if type2 == 'start':
        return int(time.mktime(time.strptime(str(target_day), '%Y-%m-%d')))
    else:
        return int(time.mktime(time.strptime(str(target_day), '%Y-%m-%d'))) - 1

獲取時區,獲取指定時區時間

rint(pytz.country_timezones('cn'))  # 查詢中國所擁有的時區
print(pytz.country_timezones('us'))  # 查詢美國所擁有的時區
tz = pytz.timezone('Asia/Shanghai')
 
# datetime.datetime.now()方法 需要傳遞一個時區,如果不傳,就默認是當前用戶所在時區
# 得到指定時區的當前時間,然後並將時間進行格式化
user_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
print(user_time)

時間數據格式之間的相互轉換

# ======== 時間數據格式之間的相互轉換:
#(1)datetime.datetime 轉str:
b = datetime.datetime.now().strftime('%Y-%m-%d')

#(2)str 轉datetime.datetime
# strptime()內參數必須爲string格式
d = datetime.datetime.strptime(b, '%Y-%m-%d')

#(3)str 轉 datetime.date
#  先將str轉datetime,再轉datetime.date
e = datetime.datetime.date(d) # date()內參數需要datetime.datetime型

#(4)datetime.date轉str
h = str(e)

pandas處理時間數據

字符串轉成標準的時間格式

pd.to_datetime(
    arg, # 輸入參數,字符串、時間格式或字符串時間數組
    errors='raise', # ignore-無效的解析返回輸入值,coerce-無效的解析設置爲NaT,raise-引發異常
    utc=None, # 返回utc國際時間
    box=True, # True-返回DatetimeIndex,False-返回ndarray數組
    format=None, # 格式化顯示時間的格式
    unit=None, # arg的單位(D,s,ms,us,ns)表示精度的單位(例如unix時間戳),它是整數/浮點數
    infer_datetime_format=False, # 如果沒有給出格式,請嘗試根據第一個datetime字符串推斷格式。在許多情況下,可以大大提高速度。
    origin='unix',
    )

常用方法:

i = pd.date_range('20000101',periods=100)
df = pd.DataFrame(dict(year = i.year, month = i.month, day = i.day))
pd.to_datetime(df.year*10000 + df.month*100 + df.day, format='%Y%m%d')

# 轉成字符串再轉成標準格式
df = df.astype(str)
pd.to_datetime(df.day + df.month + df.year, format="%d%m%Y")

生成一定範圍的時間數組

pd.date_range(
    start=None, # 開始日期
    end=None, # 結束日期
    periods=None, # 固定時期,取值爲整數或None(需要生成日期的數量),start有值,則從前往後取,如果沒有start,只有end,就是從後往前取
    freq=None, # 日期偏移量(頻率),取值爲string或DateOffset
    tz=None, # 時區
    normalize=False, # 若參數爲True表示將start、end參數值正則化到午夜時間戳
    name=None, # 生成時間索引對象的名稱,取值爲string或None
    closed=None, # 可以理解成在closed=None情況下返回的結果中,若closed=‘left’表示在返回的結果基礎上,再取左開右閉的結果,若closed='right'表示在返回的結果基礎上,再取做閉右開的結果
)

start和end支持多種日期格式:

pd.date_range(start='20170101',end='20170110')
pd.date_range(start='2017-01-01',end='2017-01-10')

 

日期偏移量 freq參數取值:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章