- 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())