pyxllib 0.3.197__py3-none-any.whl → 3.201.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyxllib/__init__.py +14 -21
- pyxllib/algo/__init__.py +8 -8
- pyxllib/algo/disjoint.py +54 -54
- pyxllib/algo/geo.py +537 -541
- pyxllib/algo/intervals.py +964 -964
- pyxllib/algo/matcher.py +389 -389
- pyxllib/algo/newbie.py +166 -166
- pyxllib/algo/pupil.py +629 -629
- pyxllib/algo/shapelylib.py +67 -67
- pyxllib/algo/specialist.py +241 -241
- pyxllib/algo/stat.py +494 -494
- pyxllib/algo/treelib.py +145 -149
- pyxllib/algo/unitlib.py +62 -66
- pyxllib/autogui/__init__.py +5 -5
- pyxllib/autogui/activewin.py +246 -246
- pyxllib/autogui/all.py +9 -9
- pyxllib/autogui/autogui.py +846 -852
- pyxllib/autogui/uiautolib.py +362 -362
- pyxllib/autogui/virtualkey.py +102 -102
- pyxllib/autogui/wechat.py +827 -827
- pyxllib/autogui/wechat_msg.py +421 -421
- pyxllib/autogui/wxautolib.py +84 -84
- pyxllib/cv/__init__.py +5 -5
- pyxllib/cv/expert.py +267 -267
- pyxllib/cv/imfile.py +159 -159
- pyxllib/cv/imhash.py +39 -39
- pyxllib/cv/pupil.py +9 -9
- pyxllib/cv/rgbfmt.py +1525 -1525
- pyxllib/cv/slidercaptcha.py +137 -137
- pyxllib/cv/trackbartools.py +251 -251
- pyxllib/cv/xlcvlib.py +1040 -1040
- pyxllib/cv/xlpillib.py +423 -423
- pyxllib/data/echarts.py +236 -240
- pyxllib/data/jsonlib.py +85 -89
- pyxllib/data/oss.py +72 -72
- pyxllib/data/pglib.py +1111 -1127
- pyxllib/data/sqlite.py +568 -568
- pyxllib/data/sqllib.py +297 -297
- pyxllib/ext/JLineViewer.py +505 -505
- pyxllib/ext/__init__.py +6 -6
- pyxllib/ext/demolib.py +251 -246
- pyxllib/ext/drissionlib.py +277 -277
- pyxllib/ext/kq5034lib.py +12 -12
- pyxllib/ext/qt.py +449 -449
- pyxllib/ext/robustprocfile.py +493 -497
- pyxllib/ext/seleniumlib.py +76 -76
- pyxllib/ext/tk.py +173 -173
- pyxllib/ext/unixlib.py +821 -827
- pyxllib/ext/utools.py +345 -351
- pyxllib/ext/webhook.py +124 -119
- pyxllib/ext/win32lib.py +40 -40
- pyxllib/ext/wjxlib.py +91 -88
- pyxllib/ext/wpsapi.py +124 -124
- pyxllib/ext/xlwork.py +9 -9
- pyxllib/ext/yuquelib.py +1110 -1105
- pyxllib/file/__init__.py +17 -17
- pyxllib/file/docxlib.py +757 -761
- pyxllib/file/gitlib.py +309 -309
- pyxllib/file/libreoffice.py +165 -165
- pyxllib/file/movielib.py +144 -148
- pyxllib/file/newbie.py +10 -10
- pyxllib/file/onenotelib.py +1469 -1469
- pyxllib/file/packlib/__init__.py +330 -330
- pyxllib/file/packlib/zipfile.py +2441 -2441
- pyxllib/file/pdflib.py +422 -426
- pyxllib/file/pupil.py +185 -185
- pyxllib/file/specialist/__init__.py +681 -685
- pyxllib/file/specialist/dirlib.py +799 -799
- pyxllib/file/specialist/download.py +193 -193
- pyxllib/file/specialist/filelib.py +2825 -2829
- pyxllib/file/xlsxlib.py +3122 -3131
- pyxllib/file/xlsyncfile.py +341 -341
- pyxllib/prog/__init__.py +5 -5
- pyxllib/prog/cachetools.py +58 -64
- pyxllib/prog/deprecatedlib.py +233 -233
- pyxllib/prog/filelock.py +42 -42
- pyxllib/prog/ipyexec.py +253 -253
- pyxllib/prog/multiprogs.py +940 -940
- pyxllib/prog/newbie.py +451 -451
- pyxllib/prog/pupil.py +1208 -1197
- pyxllib/prog/sitepackages.py +33 -33
- pyxllib/prog/specialist/__init__.py +348 -391
- pyxllib/prog/specialist/bc.py +203 -203
- pyxllib/prog/specialist/browser.py +497 -497
- pyxllib/prog/specialist/common.py +347 -347
- pyxllib/prog/specialist/datetime.py +198 -198
- pyxllib/prog/specialist/tictoc.py +240 -240
- pyxllib/prog/specialist/xllog.py +180 -180
- pyxllib/prog/xlosenv.py +110 -108
- pyxllib/stdlib/__init__.py +17 -17
- pyxllib/stdlib/tablepyxl/__init__.py +10 -10
- pyxllib/stdlib/tablepyxl/style.py +303 -303
- pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
- pyxllib/text/__init__.py +8 -8
- pyxllib/text/ahocorasick.py +36 -39
- pyxllib/text/airscript.js +754 -744
- pyxllib/text/charclasslib.py +121 -121
- pyxllib/text/jiebalib.py +267 -267
- pyxllib/text/jinjalib.py +27 -32
- pyxllib/text/jsa_ai_prompt.md +271 -271
- pyxllib/text/jscode.py +922 -922
- pyxllib/text/latex/__init__.py +158 -158
- pyxllib/text/levenshtein.py +303 -303
- pyxllib/text/nestenv.py +1215 -1215
- pyxllib/text/newbie.py +300 -300
- pyxllib/text/pupil/__init__.py +8 -8
- pyxllib/text/pupil/common.py +1121 -1121
- pyxllib/text/pupil/xlalign.py +326 -326
- pyxllib/text/pycode.py +47 -47
- pyxllib/text/specialist/__init__.py +8 -8
- pyxllib/text/specialist/common.py +112 -112
- pyxllib/text/specialist/ptag.py +186 -186
- pyxllib/text/spellchecker.py +172 -172
- pyxllib/text/templates/echart_base.html +10 -10
- pyxllib/text/templates/highlight_code.html +16 -16
- pyxllib/text/templates/latex_editor.html +102 -102
- pyxllib/text/vbacode.py +17 -17
- pyxllib/text/xmllib.py +741 -747
- pyxllib/xl.py +42 -39
- pyxllib/xlcv.py +17 -17
- pyxllib-3.201.1.dist-info/METADATA +296 -0
- pyxllib-3.201.1.dist-info/RECORD +125 -0
- {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/licenses/LICENSE +190 -190
- pyxllib/ext/old.py +0 -663
- pyxllib-0.3.197.dist-info/METADATA +0 -48
- pyxllib-0.3.197.dist-info/RECORD +0 -126
- {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/WHEEL +0 -0
@@ -1,199 +1,199 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
# @Author : 陈坤泽
|
4
|
-
# @Email : 877362867@qq.com
|
5
|
-
# @Date : 2021/06/03 23:28
|
6
|
-
|
7
|
-
"""
|
8
|
-
|
9
|
-
旧的Datetime类已删除,原来稍微比较有用的一个功能,是
|
10
|
-
|
11
|
-
替换周几,这个算法可以参考:
|
12
|
-
a = a - a.isoweekday() + kwargs['weekday'] # 先减去当前星期几,再加上1~7的一个目标星期
|
13
|
-
|
14
|
-
"""
|
15
|
-
|
16
|
-
import datetime
|
17
|
-
import re
|
18
|
-
|
19
|
-
from fastcore.utils import GetAttr
|
20
|
-
|
21
|
-
|
22
|
-
def parse_datetime(*argv):
|
23
|
-
""" 解析字符串日期时间
|
24
|
-
|
25
|
-
解析算法偏私人应用,规则虽然多,但反而变得混乱隐晦,
|
26
|
-
实际开发能明确使用具体接口,尽量还是用具体接口。
|
27
|
-
|
28
|
-
# 建议使用 Datetime.strptime
|
29
|
-
>>> parse_datetime('2019年3月6日', '%Y年%m月%d日') # 指定格式
|
30
|
-
datetime.datetime(2019, 3, 6, 0, 0)
|
31
|
-
>>> parse_datetime('w200301周日', 'w%y%m%d周日') # 周日必须写全,有缺失会报ValueError
|
32
|
-
datetime.datetime(2020, 3, 1, 0, 0)
|
33
|
-
|
34
|
-
>>> parse_datetime('2019.3.6 22:30:40')
|
35
|
-
datetime.datetime(2019, 3, 6, 22, 30, 40)
|
36
|
-
|
37
|
-
>>> parse_datetime(180213)
|
38
|
-
datetime.datetime(2018, 2, 13, 0, 0)
|
39
|
-
>>> parse_datetime('180213')
|
40
|
-
datetime.datetime(2018, 2, 13, 0, 0)
|
41
|
-
|
42
|
-
# 以下只对2000~2099年的时间点有效
|
43
|
-
>>> parse_datetime('2015-06-15_22-19-01_HDR.jpg')
|
44
|
-
datetime.datetime(2015, 6, 15, 22, 19, 1)
|
45
|
-
>>> parse_datetime('IMG_20150615_2219011234_HDR.jpg')
|
46
|
-
datetime.datetime(2015, 6, 15, 22, 19, 1, 1234)
|
47
|
-
>>> parse_datetime('_2015.6.15_22:19:02')
|
48
|
-
datetime.datetime(2015, 6, 15, 22, 19, 2)
|
49
|
-
"""
|
50
|
-
|
51
|
-
def _datetime(argv):
|
52
|
-
args, n = list(argv), len(argv)
|
53
|
-
if n < 3: # 若没填写月、日,默认1月、1日
|
54
|
-
args = args + [1] * (3 - n)
|
55
|
-
try:
|
56
|
-
return datetime.datetime(*args)
|
57
|
-
except (ValueError, TypeError) as e:
|
58
|
-
return None
|
59
|
-
|
60
|
-
def _six_digits_date(s):
|
61
|
-
"""主要是我个人常用的日期标注格式
|
62
|
-
"""
|
63
|
-
s, dt = str(s), None
|
64
|
-
if re.match(r'\d{6}$', s):
|
65
|
-
year = int(s[:2])
|
66
|
-
year = 2000 + year if year < 50 else 1900 + year # 小于50默认是20xx年,否则认为是19xx年
|
67
|
-
dt = _datetime([year, int(s[2:4]), int(s[4:])])
|
68
|
-
return dt
|
69
|
-
|
70
|
-
def _parse_time_string(s):
|
71
|
-
r"""只对2000~2099年的时间点有效
|
72
|
-
"""
|
73
|
-
data, break_flag = [], False
|
74
|
-
|
75
|
-
def parse(pattern, left=None, right=None):
|
76
|
-
"""通用底层解析器"""
|
77
|
-
nonlocal break_flag, s
|
78
|
-
if break_flag: return
|
79
|
-
|
80
|
-
m = re.search(pattern, s)
|
81
|
-
if m:
|
82
|
-
d = int(m.group())
|
83
|
-
if left and d < left:
|
84
|
-
break_flag = True
|
85
|
-
elif right and d > right:
|
86
|
-
break_flag = True
|
87
|
-
else:
|
88
|
-
data.append(d)
|
89
|
-
s = s[m.end():]
|
90
|
-
else:
|
91
|
-
break_flag = True
|
92
|
-
|
93
|
-
parse(r'20\d{2}')
|
94
|
-
parse(r'\d\d?', 1, 12) # 有连续两个数组就获得两个,否则获得一个也行
|
95
|
-
parse(r'\d\d?', 1, 31) # 这样其实不严谨,有的月份不到31天,不过反正_datetime会返回None代表处理失败的
|
96
|
-
parse(r'\d\d?', 0, 23)
|
97
|
-
parse(r'\d\d?', 0, 59)
|
98
|
-
parse(r'\d\d?', 0, 59)
|
99
|
-
parse(r'\d{1,6}') # microsecond
|
100
|
-
|
101
|
-
return _datetime(data)
|
102
|
-
|
103
|
-
dt = None
|
104
|
-
# 1 没有参数则默认当前运行时间
|
105
|
-
if not argv:
|
106
|
-
dt = datetime.datetime.now()
|
107
|
-
if not dt and isinstance(argv[0], datetime.datetime):
|
108
|
-
dt = argv[0]
|
109
|
-
if not dt and isinstance(argv[0], datetime.date):
|
110
|
-
# 要转成datetime类型,time部分默认00:00:00
|
111
|
-
dt = datetime.datetime.combine(argv[0], datetime.time())
|
112
|
-
if not dt and isinstance(argv[0], float):
|
113
|
-
dt = datetime.datetime.fromtimestamp(argv[0])
|
114
|
-
# 2 如果上述解析不了,且argv恰好为两个参数,则判断为使用strptime初始化
|
115
|
-
if not dt and len(argv) == 2:
|
116
|
-
dt = datetime.datetime.strptime(str(argv[0]), argv[1])
|
117
|
-
# 3 判断是否我个人特用的六位日期标记
|
118
|
-
if not dt:
|
119
|
-
dt = _six_digits_date(argv[0])
|
120
|
-
# 4 如果仍然解析不了,开始使用一个智能推导算法
|
121
|
-
if not dt:
|
122
|
-
dt = _parse_time_string(argv[0])
|
123
|
-
# 5 最后任何解析方案都失败,则返回None
|
124
|
-
|
125
|
-
return dt
|
126
|
-
|
127
|
-
|
128
|
-
def parse_timedelta(s):
|
129
|
-
""" 解析字符串所代表的时间差
|
130
|
-
|
131
|
-
>>> parse_timedelta('38:18')
|
132
|
-
datetime.timedelta(seconds=2298)
|
133
|
-
>>> parse_timedelta('03:55')
|
134
|
-
datetime.timedelta(seconds=235)
|
135
|
-
>>> parse_timedelta('1:34:25')
|
136
|
-
datetime.timedelta(seconds=5665)
|
137
|
-
"""
|
138
|
-
parts = s.split(':')[::-1]
|
139
|
-
d = {k: int(v) for k, v in zip(['seconds', 'minutes', 'hours'], parts)}
|
140
|
-
td = datetime.timedelta(**d)
|
141
|
-
return td
|
142
|
-
|
143
|
-
|
144
|
-
class XlWeekTag(GetAttr):
|
145
|
-
""" 个人周标签转换工具 """
|
146
|
-
_default = 'dt'
|
147
|
-
|
148
|
-
def __init__(self, dt=None):
|
149
|
-
"""
|
150
|
-
:param datetime|其他类日期表达 dt: 可以输入一个日期,默认为今天
|
151
|
-
"""
|
152
|
-
if dt is None:
|
153
|
-
dt = datetime.date.today()
|
154
|
-
self.dt = parse_datetime(dt)
|
155
|
-
|
156
|
-
def __1_日期移动(self):
|
157
|
-
pass
|
158
|
-
|
159
|
-
def add_days(self, days):
|
160
|
-
""" 增加指定天数,支持负数 """
|
161
|
-
return self.__class__(self.dt + datetime.timedelta(days=days))
|
162
|
-
|
163
|
-
def monday(self):
|
164
|
-
""" 移动到本周周一 """
|
165
|
-
return self.add_days(-self.dt.weekday())
|
166
|
-
|
167
|
-
def next_week(self):
|
168
|
-
""" 移动到下一周 """
|
169
|
-
return self.add_days(7)
|
170
|
-
|
171
|
-
def prev_week(self):
|
172
|
-
""" 移动到上一周 """
|
173
|
-
return self.add_days(-7)
|
174
|
-
|
175
|
-
def __2_生成标签(self):
|
176
|
-
pass
|
177
|
-
|
178
|
-
def weektag(self):
|
179
|
-
"""
|
180
|
-
:return: 周标签名,例如 'w250414',表示所属周的周一是2025年4月14日
|
181
|
-
"""
|
182
|
-
monday = self.monday() # 获取本周周一
|
183
|
-
tag = 'w' + monday.strftime('%y%m%d')
|
184
|
-
return tag
|
185
|
-
|
186
|
-
def daytag(self):
|
187
|
-
"""
|
188
|
-
:return: 日标签名,例如 '250415周二',表示当天的日期标记,一般是语雀周报中使用
|
189
|
-
"""
|
190
|
-
ch = '一二三四五六日'[self.dt.weekday()]
|
191
|
-
tag = self.dt.strftime('%y%m%d') + '周' + ch
|
192
|
-
return tag
|
193
|
-
|
194
|
-
def week_daytags(self):
|
195
|
-
# 循环获得本周每天的daytag
|
196
|
-
monday = self.monday()
|
197
|
-
tags = [monday.add_days(i).daytag() for i in range(7)]
|
198
|
-
return tags
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2021/06/03 23:28
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
旧的Datetime类已删除,原来稍微比较有用的一个功能,是
|
10
|
+
|
11
|
+
替换周几,这个算法可以参考:
|
12
|
+
a = a - a.isoweekday() + kwargs['weekday'] # 先减去当前星期几,再加上1~7的一个目标星期
|
13
|
+
|
14
|
+
"""
|
15
|
+
|
16
|
+
import datetime
|
17
|
+
import re
|
18
|
+
|
19
|
+
from fastcore.utils import GetAttr
|
20
|
+
|
21
|
+
|
22
|
+
def parse_datetime(*argv):
|
23
|
+
""" 解析字符串日期时间
|
24
|
+
|
25
|
+
解析算法偏私人应用,规则虽然多,但反而变得混乱隐晦,
|
26
|
+
实际开发能明确使用具体接口,尽量还是用具体接口。
|
27
|
+
|
28
|
+
# 建议使用 Datetime.strptime
|
29
|
+
>>> parse_datetime('2019年3月6日', '%Y年%m月%d日') # 指定格式
|
30
|
+
datetime.datetime(2019, 3, 6, 0, 0)
|
31
|
+
>>> parse_datetime('w200301周日', 'w%y%m%d周日') # 周日必须写全,有缺失会报ValueError
|
32
|
+
datetime.datetime(2020, 3, 1, 0, 0)
|
33
|
+
|
34
|
+
>>> parse_datetime('2019.3.6 22:30:40')
|
35
|
+
datetime.datetime(2019, 3, 6, 22, 30, 40)
|
36
|
+
|
37
|
+
>>> parse_datetime(180213)
|
38
|
+
datetime.datetime(2018, 2, 13, 0, 0)
|
39
|
+
>>> parse_datetime('180213')
|
40
|
+
datetime.datetime(2018, 2, 13, 0, 0)
|
41
|
+
|
42
|
+
# 以下只对2000~2099年的时间点有效
|
43
|
+
>>> parse_datetime('2015-06-15_22-19-01_HDR.jpg')
|
44
|
+
datetime.datetime(2015, 6, 15, 22, 19, 1)
|
45
|
+
>>> parse_datetime('IMG_20150615_2219011234_HDR.jpg')
|
46
|
+
datetime.datetime(2015, 6, 15, 22, 19, 1, 1234)
|
47
|
+
>>> parse_datetime('_2015.6.15_22:19:02')
|
48
|
+
datetime.datetime(2015, 6, 15, 22, 19, 2)
|
49
|
+
"""
|
50
|
+
|
51
|
+
def _datetime(argv):
|
52
|
+
args, n = list(argv), len(argv)
|
53
|
+
if n < 3: # 若没填写月、日,默认1月、1日
|
54
|
+
args = args + [1] * (3 - n)
|
55
|
+
try:
|
56
|
+
return datetime.datetime(*args)
|
57
|
+
except (ValueError, TypeError) as e:
|
58
|
+
return None
|
59
|
+
|
60
|
+
def _six_digits_date(s):
|
61
|
+
"""主要是我个人常用的日期标注格式
|
62
|
+
"""
|
63
|
+
s, dt = str(s), None
|
64
|
+
if re.match(r'\d{6}$', s):
|
65
|
+
year = int(s[:2])
|
66
|
+
year = 2000 + year if year < 50 else 1900 + year # 小于50默认是20xx年,否则认为是19xx年
|
67
|
+
dt = _datetime([year, int(s[2:4]), int(s[4:])])
|
68
|
+
return dt
|
69
|
+
|
70
|
+
def _parse_time_string(s):
|
71
|
+
r"""只对2000~2099年的时间点有效
|
72
|
+
"""
|
73
|
+
data, break_flag = [], False
|
74
|
+
|
75
|
+
def parse(pattern, left=None, right=None):
|
76
|
+
"""通用底层解析器"""
|
77
|
+
nonlocal break_flag, s
|
78
|
+
if break_flag: return
|
79
|
+
|
80
|
+
m = re.search(pattern, s)
|
81
|
+
if m:
|
82
|
+
d = int(m.group())
|
83
|
+
if left and d < left:
|
84
|
+
break_flag = True
|
85
|
+
elif right and d > right:
|
86
|
+
break_flag = True
|
87
|
+
else:
|
88
|
+
data.append(d)
|
89
|
+
s = s[m.end():]
|
90
|
+
else:
|
91
|
+
break_flag = True
|
92
|
+
|
93
|
+
parse(r'20\d{2}')
|
94
|
+
parse(r'\d\d?', 1, 12) # 有连续两个数组就获得两个,否则获得一个也行
|
95
|
+
parse(r'\d\d?', 1, 31) # 这样其实不严谨,有的月份不到31天,不过反正_datetime会返回None代表处理失败的
|
96
|
+
parse(r'\d\d?', 0, 23)
|
97
|
+
parse(r'\d\d?', 0, 59)
|
98
|
+
parse(r'\d\d?', 0, 59)
|
99
|
+
parse(r'\d{1,6}') # microsecond
|
100
|
+
|
101
|
+
return _datetime(data)
|
102
|
+
|
103
|
+
dt = None
|
104
|
+
# 1 没有参数则默认当前运行时间
|
105
|
+
if not argv:
|
106
|
+
dt = datetime.datetime.now()
|
107
|
+
if not dt and isinstance(argv[0], datetime.datetime):
|
108
|
+
dt = argv[0]
|
109
|
+
if not dt and isinstance(argv[0], datetime.date):
|
110
|
+
# 要转成datetime类型,time部分默认00:00:00
|
111
|
+
dt = datetime.datetime.combine(argv[0], datetime.time())
|
112
|
+
if not dt and isinstance(argv[0], float):
|
113
|
+
dt = datetime.datetime.fromtimestamp(argv[0])
|
114
|
+
# 2 如果上述解析不了,且argv恰好为两个参数,则判断为使用strptime初始化
|
115
|
+
if not dt and len(argv) == 2:
|
116
|
+
dt = datetime.datetime.strptime(str(argv[0]), argv[1])
|
117
|
+
# 3 判断是否我个人特用的六位日期标记
|
118
|
+
if not dt:
|
119
|
+
dt = _six_digits_date(argv[0])
|
120
|
+
# 4 如果仍然解析不了,开始使用一个智能推导算法
|
121
|
+
if not dt:
|
122
|
+
dt = _parse_time_string(argv[0])
|
123
|
+
# 5 最后任何解析方案都失败,则返回None
|
124
|
+
|
125
|
+
return dt
|
126
|
+
|
127
|
+
|
128
|
+
def parse_timedelta(s):
|
129
|
+
""" 解析字符串所代表的时间差
|
130
|
+
|
131
|
+
>>> parse_timedelta('38:18')
|
132
|
+
datetime.timedelta(seconds=2298)
|
133
|
+
>>> parse_timedelta('03:55')
|
134
|
+
datetime.timedelta(seconds=235)
|
135
|
+
>>> parse_timedelta('1:34:25')
|
136
|
+
datetime.timedelta(seconds=5665)
|
137
|
+
"""
|
138
|
+
parts = s.split(':')[::-1]
|
139
|
+
d = {k: int(v) for k, v in zip(['seconds', 'minutes', 'hours'], parts)}
|
140
|
+
td = datetime.timedelta(**d)
|
141
|
+
return td
|
142
|
+
|
143
|
+
|
144
|
+
class XlWeekTag(GetAttr):
|
145
|
+
""" 个人周标签转换工具 """
|
146
|
+
_default = 'dt'
|
147
|
+
|
148
|
+
def __init__(self, dt=None):
|
149
|
+
"""
|
150
|
+
:param datetime|其他类日期表达 dt: 可以输入一个日期,默认为今天
|
151
|
+
"""
|
152
|
+
if dt is None:
|
153
|
+
dt = datetime.date.today()
|
154
|
+
self.dt = parse_datetime(dt)
|
155
|
+
|
156
|
+
def __1_日期移动(self):
|
157
|
+
pass
|
158
|
+
|
159
|
+
def add_days(self, days):
|
160
|
+
""" 增加指定天数,支持负数 """
|
161
|
+
return self.__class__(self.dt + datetime.timedelta(days=days))
|
162
|
+
|
163
|
+
def monday(self):
|
164
|
+
""" 移动到本周周一 """
|
165
|
+
return self.add_days(-self.dt.weekday())
|
166
|
+
|
167
|
+
def next_week(self):
|
168
|
+
""" 移动到下一周 """
|
169
|
+
return self.add_days(7)
|
170
|
+
|
171
|
+
def prev_week(self):
|
172
|
+
""" 移动到上一周 """
|
173
|
+
return self.add_days(-7)
|
174
|
+
|
175
|
+
def __2_生成标签(self):
|
176
|
+
pass
|
177
|
+
|
178
|
+
def weektag(self):
|
179
|
+
"""
|
180
|
+
:return: 周标签名,例如 'w250414',表示所属周的周一是2025年4月14日
|
181
|
+
"""
|
182
|
+
monday = self.monday() # 获取本周周一
|
183
|
+
tag = 'w' + monday.strftime('%y%m%d')
|
184
|
+
return tag
|
185
|
+
|
186
|
+
def daytag(self):
|
187
|
+
"""
|
188
|
+
:return: 日标签名,例如 '250415周二',表示当天的日期标记,一般是语雀周报中使用
|
189
|
+
"""
|
190
|
+
ch = '一二三四五六日'[self.dt.weekday()]
|
191
|
+
tag = self.dt.strftime('%y%m%d') + '周' + ch
|
192
|
+
return tag
|
193
|
+
|
194
|
+
def week_daytags(self):
|
195
|
+
# 循环获得本周每天的daytag
|
196
|
+
monday = self.monday()
|
197
|
+
tags = [monday.add_days(i).daytag() for i in range(7)]
|
198
|
+
return tags
|
199
199
|
|