• 2023-1-1 是礼拜天
  • pd.Timestamp("2023-1-1").isocalendar()
  • (2022, 52, 7)
  • 记为上一年的最后一周!
  • 注意 年初
  • 礼拜5-7 记入上周 礼拜1-4 记入本周
  • 2024-12-31 是礼拜二
  • 记入 下一年的第一周!
  • 特殊情况 年底!
  • 礼拜1-3 记入下一年第一周 礼拜4-7上一年最后一周
  • 年中不用考虑这些情况



0 2024-01-01   (2024, 1, 1)   True

0 2030-01-01   (2030, 1, 2)   True

0 2031-01-01   (2031, 1, 3)   True

0 2032-01-01   (2032, 1, 4)   True

0 2038-01-01  (2037, 53, 5)  False

0 2039-01-01  (2038, 52, 6)  False

0 2040-01-01  (2039, 52, 7)  False

           0              1      2

0 2029-12-31   (2030, 1, 1)  False

0 2030-12-31   (2031, 1, 2)  False

0 2031-12-31   (2032, 1, 3)  False

0 2037-12-31  (2037, 53, 4)   True

0 2038-12-31  (2038, 52, 5)   True

0 2039-12-31  (2039, 52, 6)   True

0 2045-12-31  (2045, 52, 7)   True


  • pd.Timestamp.isocalendar()与pd.Series.dt.isocalendar()区别
  • pd.DatetimeIndex.isocalendar() 与 series的一致 **但不要加dt**
ser.dt.isocalendar()
   year  week  day
ts.isocalendar().__dir__()
  • 'year', 'week', 'weekday', ...
def test():
    date = "2024-1-1"
    ts = pd.Timestamp(date)

    calDate = ts.isocalendar()
    print(calDate.weekday)

    ser = pd.Series(ts).dt.isocalendar()
    print(ser.day.iat[0])
date_range = pd.date_range(start='1/1/2020', end='12/31/2022')  # pd.DatetimeIndex; 0: pd.Timestamp; dtype: datetime64
df = date_range.isocalendar()  # 与 pd.Series.dt.isocalendar() 一致


  • python给出一个列表 展示七个日期字符串 要求: 均为某年的1月1日 但分别为星期一到星期天
  • 容易错误的地方
  • datetime.date.weekday() 以礼拜一为0
  • pd.Timestamp.isocalendar() 以礼拜一为1
# 简洁
import datetime

def find_dates():
    dates = []
    year = 2024
    while len(dates) < 7:
        date = datetime.date(year, 1, 1)
        if len(dates) == date.weekday():
            dates.append(date.strftime("%Y-%m-%d"))
        year += 1
    return dates

print(find_dates())


# 易懂
import datetime

def find_dates():
    dates = []
    year = 2024
    for i in range(7):  # datetime.date.weekday() 以礼拜一为0
        bool_find = False
        while bool_find == False:
            date = datetime.date(year, 1, 1)
            bool_find = date.weekday() == i
            if bool_find:
                dates.append(date.strftime("%Y-%m-%d"))
            else:
                year += 1
    return dates


  • 测试代码
import datetime
import pandas as pd


def test(path: str = "", file_name: str = ""):
    path = os.path.join(path, file_name)
    df = pd.read_csv(path).reset_index(names="index")

    # 排序默认
    df["index"] = df["index"].astype("int32").astype(str)
    if np.issubdtype(df["清账日期"].dtype, np.integer):
        df["清账日期"] = df["清账日期"].apply(lambda row: pd.to_datetime(row, unit="D", origin=pd.Timestamp('1900-01-01')))
    else:
        df["清账日期"] = pd.to_datetime(df["清账日期"])

    ser = calc_week(df["清账日期"])
    print(ser)

def test():
    date = "2023-1-1"  # 星期天 记入上年最后一周
    date = "2010-1-1"  # 星期五 记入上年最后一周
    date = "2024-1-1"  # 星期一 记入本年第一周
    ts = pd.Timestamp(date)
    ts = pd.to_datetime(date)  # unit只用于数值
    var = ts.isocalendar()
    print(var)
    ser = pd.Series(ts).dt.isocalendar()
    print(ser)

def find_dates():
    dates = []
    year = 2024
    for i in range(7):  # datetime.date.weekday() 以礼拜一为0
        bool_find = False
        while bool_find == False:
            date = datetime.date(year, 1, 1)
            bool_find = date.weekday() == i
            if bool_find:
                dates.append(date.strftime("%Y-%m-%d"))
            else:
                year += 1
    return dates

def test():
    lis = find_dates()
    df = pd.DataFrame()
    for date in lis:
        ts = pd.Timestamp(date)
        calDate = ts.isocalendar()
        df_date = pd.DataFrame([[ts, calDate, ts.year==calDate.year]])
        df = pd.concat([df, df_date])
    print(df)

if __name__ == "__main__":
    print(test())