【python 时间】datetime、time、date

18 篇文章 0 订阅
15 篇文章 1 订阅
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参数取值:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值