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參數取值: