python-web: 常见时间处理函数

获取所在月份第一天的开始时间点

def get_month_begin_time(time=None):
    """
    获取 time 所在月份的第一天的开始时间点
    :param time:
    :return:
    """
    if time is None:
        time = datetime.datetime.now()
    return time.replace(day=1, hour=0, minute=0, second=0, microsecond=0)


if __name__ == "__main__":
    myday = datetime.datetime.now()
    print(myday)  # 2019-07-05 18:17:36.170380
    ret = get_month_begin_time(myday)
    print(ret)   # 2019-07-01 00:00:00

获取所在月份最后一天的结束时间点

注意当前月份是 12 的情况, 就会抛出 ValueError, 进行捕获之后进行相应的处理:

def get_month_end_time(time=None):
    """
    获取 time 所在月份的最后一天的结束时间点
    :param time:
    :return:
    """
    try:
        return time.replace(month=time.month + 1, day=1, hour=23, minute=59, second=59,
                            microsecond=999) - datetime.timedelta(days=1)
    except ValueError:
        # 如果是 12 月份进行的处理:
        return time.replace(year=time.year + 1, month=1, day=1, hour=23, minute=59, second=59,
                            microsecond=999) - datetime.timedelta(days=1)


if __name__ == "__main__":
    myday = datetime.datetime(1997, 12, 23, 12, 34, 30)
    ret = get_month_end_time(myday)  # 1997-12-31 23:59:59.000999
    print(ret)  # 1997-12-31 23:59:59.000999

获取交易日历中当前时间之前的一天

def get_last_date(trading_calendar, dt):
    """
    获取在 trading_calendar 中 dt 之前的一天
    :param trading_calendar: numpy.ndarray
    :param dt:
    :return:
    """
    idx = trading_calendar.searchsorted(dt)
    return trading_calendar[idx - 1]


if __name__ == "__main__":
    import numpy as np
    dl = [datetime.datetime(2019, 7, 1), datetime.datetime(2019, 7, 2),
          datetime.datetime(2019, 7, 5), datetime.datetime(2019, 7, 6)]
    tc = np.array(dl)
    dt = datetime.datetime(2019, 7, 3)
    ret = get_last_date(tc, dt)
    print(ret)   # 2019-07-02 00:00:00

datetime 和 int 之间的相互转换

datetime 转 int

年月日
def convert_date_to_date_int(dt):
    """
    将 datetime 转换为 int 的格式
    :param dt:
    :return:
    """
    t = dt.year * 10000 + dt.month * 100 + dt.day
    return t


if __name__ == "__main__":
    dt = datetime.datetime(2019, 6, 5)
    ret = convert_date_to_date_int(dt)
    print(ret)  # 20190605
年月日时分秒
def convert_date_to_int(dt):
    """
    将 datetime 转换为 int 的格式 且计数时 分 秒均按照 0 刻度计算
    比如说将 datetime.datetime(2019, 4, 27) --> 20190427000000
    :param dt:
    :return:
    """
    t = dt.year * 10000 + dt.month * 100 + dt.day
    t *= 1000000
    return t


def convert_dt_to_int(dt):
    """
    将 datetime 转换为 int 的格式 精确到 时 分 秒
    :param dt:
    :return:
    """
    t = convert_date_to_int(dt)
    t += dt.hour * 10000 + dt.minute * 100 + dt.second
    return t


if __name__ == "__main__":
    dt = datetime.datetime.now()
    ret = convert_dt_to_int(dt)
    print(ret)

int 转 datetime

保留年月日
def convert_int_to_date(dt_int):
    """
    先去掉时 分 秒, 再转换为 datetime 的格式
    即 datetime 只保留年月日 
    :param dt_int:
    :return:
    """
    dt_int = int(dt_int)
    if dt_int > 100000000:
        dt_int //= 1000000
    return _convert_int_to_date(dt_int)


@lru_cache(None)
def _convert_int_to_date(dt_int):
    """
    将 int 转化为 datetime 的格式
    :param dt_int:
    :return:
    """
    year, r = divmod(dt_int, 10000)   # divmod 取商和余数
    month, day = divmod(r, 100)
    return datetime.datetime(year, month, day)


if __name__ == "__main__":
    dateint = 20190701
    ret1 = _convert_int_to_date(dateint)
    print(ret1)
    dateint_ = 20190706092300
    ret2 = convert_int_to_date(dateint_)
    print(ret2)
保留年月日时分秒
@lru_cache(20480)
def convert_int_to_datetime(dt_int):
    """
    将 date_int 转换为 datetime 的格式,保留时分秒
    :param dt_int:
    :return:
    """
    dt_int = int(dt_int)
    year, r = divmod(dt_int, 10000000000)
    month, r = divmod(r, 100000000)
    day, r = divmod(r, 1000000)
    hour, r = divmod(r, 10000)
    minute, second = divmod(r, 100)
    return datetime.datetime(year, month, day, hour, minute, second)


if __name__ == "__main__":
    date_int = 20190706092312
    ret = convert_int_to_datetime(date_int)
    print(ret)  # 2019-07-06 09:23:12
两个时间 int 的拼接
def convert_date_time_ms_int_to_datetime(date_int, time_int):
    """
    将 date_int 和 time_int 合并成一个 datetime
    :param date_int:
    :param time_int:
    :return:
    """
    date_int, time_int = int(date_int), int(time_int)
    dt = _convert_int_to_date(date_int)
    # print(dt)

    hours, r = divmod(time_int, 10000000)
    print(hours)
    minutes, r = divmod(r, 100000)
    seconds, millisecond = divmod(r, 1000)

    return dt.replace(hour=hours, minute=minutes, second=seconds,
                      microsecond=millisecond * 1000)


if __name__ == "__main__":
    date_int = 19001203
    time_int = 91231123
    ret = convert_date_time_ms_int_to_datetime(date_int, time_int)
    print(ret)

猜你喜欢

转载自blog.csdn.net/Enjolras_fuu/article/details/94833122
今日推荐