Python:日期时间

目录

格式化符号

1、获取当前日期时间并进行转换

2、字符串↔时间戳

3、日期戳(五位整数)转日期格式

4、时区字符转日期时间

5、获取当前第几周

6、根据第几周获取日期

7、根据日期获取年周(划分周)

增减天、时、分、秒

天数差

月份差

日期转字符不自动补零

返回当前日期星期几

判断变量是否为日期


格式化符号

符号-小写

描述

符号-大写

描述

%a

本地简化星期名称

%A

本地完整星期名称

%b

本地简化的月份名称

%B

本地完整的月份名称

%c

本地相应的日期表示和时间表示

%d

月内中的一天(0-31)

%D

%m/%d/%y的简写

%F

%Y-%m-%d的简写

%H

24小时制小时数(00-23)

%I

12小时制小时数(01-12)

%j

年内的一天(001-366)

%m

月份(01-12)

%M

分钟数(00=59)

%S

秒(00-59)

%p

本地A.M.或P.M.的等价符

%U

一年中的星期数(00-53)星期天为星期的开始

%w

星期(0-6),星期天为星期的开始

%W

一年中的星期数(00-53)星期一为星期的开始

%x

本地相应的日期表示

%X

本地相应的时间表示

%y

两位数的年份表示(00-99)

%Y

四位数的年份表示(000-9999)

%Z

当前时区的名称

%%

%号本身

1、获取当前日期时间并进行转换

  • 获取当前时间(time):time.time()1657284531.02981 类型:float
    • 转struct_time:time.localtime(time.time())类型:time.struct_time
    • 转字符串:time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))类型:str
  • 获取当前时间(datetime):datetime.now()datetime.datetime(2022, 7, 8, 21, 3, 15, 550059) 类型:datetime
    • 转struct_time:datetime.now().timetuple()
    • 转字符串:datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S')
    • 转时间戳:datetime.timestamp(datetime.now())

2、字符串↔时间戳

字符串➡时间戳

  • 使用 time:time.mktime(time.strptime(time_str, '%Y-%m-%d %H:%M:%S'))
  • 使用 datetime:datetime.timestamp(datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S'))
  • 使用 pandas:time.mktime(pd.to_datetime(date_str).timetuple())

时间戳➡字符串:

  • 使用 datetime:datetime.strftime(datetime.fromtimestamp(datetime_stamp2), '%Y-%m-%d %H:%M:%S')

3、日期戳(五位整数)转日期格式

  • 使用 datetime:pd.to_datetime('1899-12-30') + pd.Timedelta(str(stamp)+'D')
pd.to_datetime('1899-12-30') + pd.Timedelta(str(44582)+'D')
Timestamp('2022-01-21 00:00:00')
pd.to_datetime('1899-12-30') + pd.Timedelta(str(44582.1242324)+'D')
Timestamp('2022-01-21 02:58:53.679360')

4、时区字符转日期时间

time_str = "Fri Jul 08 20:22:37 +0800 2022"

datetime.fromtimestamp(time.mktime(time.strptime(time_string, '%a %b %d %H:%M:%S +0800 %Y')))

5、获取当前第几周

方法一:time.strftime("%W")

方法二:datetime.now().isocalendar()[1]datetime(2018,6,30).isocalendar()[1]

方法三:time.localtime()[7]/7+1

6、根据第几周获取日期

from datetime import datetime, timedelta, date
import calendar
def get_date_range_by_week(week_number, year):
    # 获取给定年份的第一天
    first_day = date(year, 1, 1)

    # 获取给定年份的最后一天
    last_day = date(year, 12, 31)

    # 计算第一天所在周的周一的日期
    first_weekday = first_day - timedelta(days=first_day.weekday())

    # 计算最后一天所在周的周日的日期
    last_weekday = last_day + timedelta(days=(6 - last_day.weekday()))

    # 获取给定周数的起始日期
    start_date = first_weekday + timedelta(weeks=week_number - 1)

    # 获取给定周数的结束日期
    end_date = start_date + timedelta(days=6)

    return start_date, end_date

print(get_date_range_by_week(20, 2023))

比如2019年第46周 周一的日期

wk = '2019-W46-1'

datetime.strptime(wk, '%Y-W%W-%w')

def str2date(string):
    """将字符串日期、周次转为日期
    字符串日期格式:2022.7.1 2022.07.01 7.1
    周次格式:W52
    """
    
    string = string.strip('/')
    if re.search('W\d{1,2}', string, re.IGNORECASE):
        week = int(re.search('\d{1,2}', string).group())
        current_week = datetime.now().isocalendar()[1]
        years = datetime.now().year if week <= current_week else datetime.now().year - 1
        wk = str(years) + '-W' + str(week) + '-1'
        date = datetime.strptime(wk, '%Y-W%W-%w')
    else:
        if string.count('.') == 1:
            years = datetime.now().year if int(string.split('.')[0]) < datetime.now().month else datetime.now().year - 1
            string = str(years) + '.' + string
            
            date = datetime.strptime(string, '%Y.%m.%d')
            
    return date

Python,获取指定日期所在周次,以及周次的日期范围

Python 给定周数,返回其对应的日期范围-CSDN博客

python-根据给定的时间范围计算年、季、月、周的开始和结束日期_python strftime 季-CSDN博客

7、根据日期获取年周(划分周)

需求:不跨年划分,以星期一为开始,星期天为结束,如果第一周的天数小于3天,则将其划入第二周一起算第一周,下一周算第二周,依次类推

from datetime import datetime, timedelta


def get_week_number(date):
    """
    不跨年划分,以星期一为开始,星期天为结束,如果第一周的天数小于3天,则将其划入第二周一起算第一周,下一周算第二周,依次类推
    """
    start_date = datetime(date.year, 1, 1)  # 一年的开始日期
    start_weekday = start_date.weekday()  # 一年的开始日期是星期几

    # 如果一年的开始日期大于星期四,则将其调整为下一个星期一,否则将其调整为当前星期一
    if start_weekday > 3:
        start_date += timedelta(days=(7 - start_weekday))
    else:
        start_date += timedelta(days=(- start_weekday))
    # print(start_date)
    diff = (date - start_date) + timedelta(days=1)
    if date < start_date:
        return 1
    week_number = diff.days // 7 + (1 if diff.days % 7 > 0 else 0)
    if start_weekday < 3:
        week_number += 1
    return week_number


# 示例日期列表
dates = [
    datetime(2022, 1, 1),  # 第1周 星期六
    datetime(2022, 12, 31),  # 第52周 星期六
    datetime(2023, 1, 1),  # 第1周 星期天
    datetime(2023, 1, 2),  # 第1周
    datetime(2023, 1, 8),  # 第1周
    datetime(2023, 1, 9),  # 第2周
    datetime(2023, 1, 15),  # 第2周
    datetime(2023, 6, 25),  # 第25周
]

# 根据日期划分周并打印结果
for date in dates:
    week_number = get_week_number(date)
    print(f"{date.date()} belongs to week {week_number}")

增减天、时、分、秒

from datetime import datetime

EndDate = Date.today()+timedelta(days=10)

增加年、月

import datetime

dt = datetime.datetime.now()  # 获取当前日期时间
print("原始日期时间:", dt)

# 修改年份为2022
new_dt = dt.replace(year=2022)
print("修改后的日期时间:", new_dt)

天数差

# 方法1
# (1)先将字符串-->时间格式date
date1 = datetime.datetime.strptime(d1, "%Y-%m-%d").date()
date2 = datetime.datetime.strptime(d2, "%Y-%m-%d").date()

a1 = (date2 - date1).days     # 计算两个日期date的天数差
print("a1", a1)

# 方法2
a2 = (parser.parse(d2) - parser.parse(d1)).days
print("a2", a2)
# 方法3
a3 = rrule.rrule(rrule.DAILY, dtstart=date1, until=date2).count()
print("a3", a3)


# datetime形式天数差
date1 = datetime.datetime(2022, 7, 26, 15, 35, 10)
date2 = datetime.datetime(2022, 8, 1, 18, 30, 20)

# 方法1
b1 = (date2 - date1).days
print("b1", b1)
# 方法2
b2 = (parser.parse(d2) - parser.parse(d1)).days
print("b2", b2)
# 方法3
b3 = rrule.rrule(rrule.DAILY, dtstart=date1, until=date2).count()
print("b3", b3)
-----------------------------------
python datetime 计算两个日期之间的天数差
https://blog.51cto.com/u_12461028/5575525

计算两个timestamp相差天数:

import datetime

# 将时间戳转换为日期格式
date1 = datetime.datetime.fromtimestamp(timestamp1)
date2 = datetime.datetime.fromtimestamp(timestamp2)

# 提取日期部分,忽略时间部分
date1 = date1.date()
date2 = date2.date()

# 计算日期之间的差异
difference = date2 - date1

# 获取差异的天数
days = difference.days

print("时间戳相差的天数:", days)

月份差

from datetime import date
from dateutil.relativedelta import relativedelta

# 给定的年月
year1 = 2022
month1 = 5

year2 = 2023
month2 = 2

# 构建日期对象
date1 = date(year1, month1, 1)
date2 = date(year2, month2, 1)

# 计算月份数
delta = relativedelta(date2, date1)
months_difference = delta.months + 12 * delta.years

# 打印结果
print(months_difference)

日期转字符不自动补零

对于Linux 需要在字段类型前加上 -

对于win 需要再字段类型前加上 #

format = "%Y-%#m-%#d %H:%M:%S"

返回当前日期星期几

datetime.today().weekday()

datetime.strptime("2023-02-22","%Y-%m-%d").weekday()

返回值:

  • number:6-周日,0-周一,

判断变量是否为日期

你可能感兴趣的:(Python,python)