获取所在月份第一天的开始时间点
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)