convert-stream 2.3.8__tar.gz → 2.4__tar.gz
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.
- {convert_stream-2.3.8 → convert_stream-2.4}/PKG-INFO +1 -1
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/__init__.py +4 -3
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/image/img_object.py +1 -1
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/mod_types/__init__.py +2 -4
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/mod_types/table_types.py +121 -102
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/pdf/pdf_document.py +14 -10
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/pdf/pdf_page.py +5 -3
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/text/__init__.py +4 -4
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/text/date.py +39 -2
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream.egg-info/PKG-INFO +1 -1
- {convert_stream-2.3.8 → convert_stream-2.4}/pyproject.toml +1 -1
- {convert_stream-2.3.8 → convert_stream-2.4}/README.md +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/__main__.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/_version.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/doc_stream.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/image/__init__.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/mod_types/enums.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/mod_types/modules.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/pdf/__init__.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/pdf/image_to_pdf.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/pdf/pdf_to_image.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/sheets/__init__.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/sheets/load.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/sheets/parse.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/sheets/save.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/table_files.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/text/find_text.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream/text/terminal.py +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream.egg-info/SOURCES.txt +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream.egg-info/dependency_links.txt +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream.egg-info/requires.txt +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/convert_stream.egg-info/top_level.txt +0 -0
- {convert_stream-2.3.8 → convert_stream-2.4}/setup.cfg +0 -0
|
@@ -10,13 +10,14 @@ from ._version import (
|
|
|
10
10
|
from .mod_types import (
|
|
11
11
|
MetaDataFile, MetaDataItem, create_metadata, ColumnsTable, ListString, ArrayString,
|
|
12
12
|
HeadCell, HeadValues, ColumnBody, TextTable, LibDate, LibPDF, LibImage, LibPdfToImage,
|
|
13
|
-
LibImageToPdf,
|
|
13
|
+
LibImageToPdf, DictTextTable, RotationAngle,
|
|
14
14
|
)
|
|
15
15
|
from .image import ImageObject, CollectionImages
|
|
16
16
|
from .pdf import DocumentPdf, PageDocumentPdf, CollectionPagePdf, ConvertPdfToImages, ConvertImageToPdf
|
|
17
17
|
from .pdf.pdf_document import SearchableTextPdf
|
|
18
18
|
from .doc_stream import PdfStream, SplitPdf
|
|
19
19
|
from .table_files import PdfFinder
|
|
20
|
+
from .text import ConvertStringDate, fmt_col_to_date
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
def __create_stream() -> PdfStream:
|
|
@@ -79,7 +80,7 @@ __all__ = [
|
|
|
79
80
|
'PdfFinder', 'SplitPdf', 'LibImageToPdf', 'RotationAngle', 'ConvertImageToPdf', 'ConvertPdfToImages',
|
|
80
81
|
'MetaDataFile', 'MetaDataItem', 'ColumnsTable', 'ListString', 'ArrayString',
|
|
81
82
|
'HeadCell', 'HeadValues', 'ColumnBody', 'TextTable', 'LibDate', 'LibPDF', 'LibImage', 'LibPdfToImage',
|
|
82
|
-
'read_pdf', 'read_files_pdf', 'read_image', '
|
|
83
|
-
'create_metadata',
|
|
83
|
+
'read_pdf', 'read_files_pdf', 'read_image', 'DictTextTable',
|
|
84
|
+
'create_metadata', 'fmt_col_to_date',
|
|
84
85
|
]
|
|
85
86
|
|
|
@@ -10,8 +10,7 @@ from .enums import (
|
|
|
10
10
|
|
|
11
11
|
from .table_types import (
|
|
12
12
|
TextTable, ListString, ArrayString, HeadCell, HeadValues,
|
|
13
|
-
ColumnBody,
|
|
14
|
-
create_dict_map_from_file, concat_maps, contains, get_text_from_file
|
|
13
|
+
ColumnBody, DictTextTable, concat_maps, contains,
|
|
15
14
|
)
|
|
16
15
|
|
|
17
16
|
|
|
@@ -92,8 +91,7 @@ def create_metadata(file: str | File) -> MetaDataFile:
|
|
|
92
91
|
|
|
93
92
|
__all__ = [
|
|
94
93
|
'get_hash_from_bytes', 'get_void_metadata', 'get_void_metadata', 'contains',
|
|
95
|
-
'concat_maps', '
|
|
96
|
-
'create_void_df_map', 'create_void_dict_map', 'ColumnBody', 'ColumnsTable',
|
|
94
|
+
'concat_maps', 'DictTextTable', 'ColumnBody', 'ColumnsTable',
|
|
97
95
|
'ListString', 'HeadCell', 'HeadValues', 'TextTable', 'RotationAngle', 'LibPDF',
|
|
98
96
|
'LibImageToPdf', 'LibPdfToImage', 'LibImage', 'LibDate', 'ArrayString',
|
|
99
97
|
'MetaDataFile', 'MetaDataItem', 'create_metadata',
|
|
@@ -292,110 +292,129 @@ class TextTable(dict):
|
|
|
292
292
|
self[col.col_name] = col
|
|
293
293
|
|
|
294
294
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
def create_void_df_map() -> pd.DataFrame:
|
|
310
|
-
"""
|
|
311
|
-
Retorna um DataFrame() vazio, apenas com as colunas formatadas
|
|
312
|
-
para tabela de arquivos.
|
|
313
|
-
@rtype: pd.DataFrame
|
|
314
|
-
"""
|
|
315
|
-
return pd.DataFrame.from_dict(create_void_dict_map())
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
def create_dict_map_values(
|
|
319
|
-
values: list[str], *,
|
|
320
|
-
page_num: str = 'nan',
|
|
321
|
-
file_path: str = 'nan',
|
|
322
|
-
dir_path: str = 'nan',
|
|
323
|
-
file_type: str = 'nan',
|
|
324
|
-
) -> dict[str, ColumnBody]:
|
|
325
|
-
"""
|
|
326
|
-
Criar um DataFrame() a partir do mapa de um texto list[str]
|
|
327
|
-
:param values: texto list[str]
|
|
328
|
-
:param page_num: numero da página PDF caso o texto seja de uma página PDF.
|
|
329
|
-
:param file_path: path do arquivo.
|
|
330
|
-
:param dir_path: diretório pai do arquivo.
|
|
331
|
-
:param file_type: tipo do arquivo.
|
|
332
|
-
:return: DataFrame
|
|
333
|
-
@rtype: pd.DataFrame
|
|
334
|
-
"""
|
|
335
|
-
max_num = len(values)
|
|
336
|
-
if max_num < 1:
|
|
337
|
-
return create_void_dict_map()
|
|
338
|
-
|
|
339
|
-
_map: dict[str, ColumnBody] = create_void_dict_map()
|
|
340
|
-
_map[ColumnsTable.KEY.value].extend([f'{x}' for x in range(0, max_num)])
|
|
341
|
-
_map[ColumnsTable.NUM_PAGE.value].extend([page_num] * max_num)
|
|
342
|
-
_map[ColumnsTable.NUM_LINE.value].extend([f'{x+1}' for x in range(0, max_num)])
|
|
343
|
-
_map[ColumnsTable.TEXT.value].extend(values)
|
|
344
|
-
_map[ColumnsTable.FILE_NAME.value].extend([os.path.basename(file_path)] * max_num)
|
|
345
|
-
_map[ColumnsTable.FILETYPE.value].extend([file_type] * max_num)
|
|
346
|
-
_map[ColumnsTable.FILE_PATH.value].extend([file_path] * max_num)
|
|
347
|
-
_map[ColumnsTable.DIR.value].extend([dir_path] * max_num)
|
|
348
|
-
return _map
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
def create_dict_map_from_file(
|
|
352
|
-
file: File,
|
|
353
|
-
values: list[str], *,
|
|
354
|
-
page_num: str = 'nan'
|
|
355
|
-
) -> dict[str, ColumnBody]:
|
|
356
|
-
"""
|
|
357
|
-
Criar um DataFrame() a partir do mapa de um texto list[str]
|
|
358
|
-
:param file: arquivo no disco do qual o texto (list[str]) foi extraído
|
|
359
|
-
:param values: texto list[str]
|
|
360
|
-
:param page_num: numero da página PDF caso o texto seja de uma página PDF.
|
|
361
|
-
|
|
362
|
-
"""
|
|
363
|
-
max_num = len(values)
|
|
364
|
-
if max_num < 1:
|
|
365
|
-
return create_void_dict_map()
|
|
366
|
-
return create_dict_map_values(
|
|
367
|
-
values, page_num=page_num, file_path=file.absolute(), dir_path=file.dirname(), file_type=file.extension()
|
|
368
|
-
)
|
|
295
|
+
class DictTextTable(TextTable):
|
|
296
|
+
|
|
297
|
+
default_columns = [
|
|
298
|
+
ColumnBody(ColumnsTable.KEY.value, ListString([])),
|
|
299
|
+
ColumnBody(ColumnsTable.NUM_PAGE.value, ListString([])),
|
|
300
|
+
ColumnBody(ColumnsTable.NUM_LINE.value, ListString([])),
|
|
301
|
+
ColumnBody(ColumnsTable.TEXT.value, ListString([])),
|
|
302
|
+
ColumnBody(ColumnsTable.FILE_NAME.value, ListString([])),
|
|
303
|
+
ColumnBody(ColumnsTable.FILETYPE.value, ListString([])),
|
|
304
|
+
ColumnBody(ColumnsTable.FILE_PATH.value, ListString([])),
|
|
305
|
+
ColumnBody(ColumnsTable.DIR.value, ListString([])),
|
|
306
|
+
]
|
|
369
307
|
|
|
308
|
+
def __init__(self, body_list: list[ColumnBody]):
|
|
309
|
+
super().__init__(body_list)
|
|
370
310
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
311
|
+
@property
|
|
312
|
+
def columns(self) -> HeadValues:
|
|
313
|
+
_cols = list(self.keys())
|
|
314
|
+
return HeadValues([HeadCell(x) for x in _cols])
|
|
315
|
+
|
|
316
|
+
def to_data(self) -> pd.DataFrame:
|
|
317
|
+
return pd.DataFrame.from_dict(self)
|
|
318
|
+
|
|
319
|
+
@classmethod
|
|
320
|
+
def create_void_dict(cls) -> DictTextTable:
|
|
321
|
+
|
|
322
|
+
_default = [
|
|
323
|
+
ColumnBody(ColumnsTable.KEY.value, ListString([])),
|
|
324
|
+
ColumnBody(ColumnsTable.NUM_PAGE.value, ListString([])),
|
|
325
|
+
ColumnBody(ColumnsTable.NUM_LINE.value, ListString([])),
|
|
326
|
+
ColumnBody(ColumnsTable.TEXT.value, ListString([])),
|
|
327
|
+
ColumnBody(ColumnsTable.FILE_NAME.value, ListString([])),
|
|
328
|
+
ColumnBody(ColumnsTable.FILETYPE.value, ListString([])),
|
|
329
|
+
ColumnBody(ColumnsTable.FILE_PATH.value, ListString([])),
|
|
330
|
+
ColumnBody(ColumnsTable.DIR.value, ListString([])),
|
|
331
|
+
]
|
|
332
|
+
return cls(_default)
|
|
333
|
+
|
|
334
|
+
@classmethod
|
|
335
|
+
def create_void_df(cls) -> pd.DataFrame:
|
|
336
|
+
return pd.DataFrame.from_dict(cls.create_void_dict())
|
|
337
|
+
|
|
338
|
+
@classmethod
|
|
339
|
+
def create_from_values(
|
|
340
|
+
cls,
|
|
341
|
+
values: list[str], *,
|
|
342
|
+
page_num: str = 'nan',
|
|
343
|
+
file_path: str = 'nan',
|
|
344
|
+
dir_path: str = 'nan',
|
|
345
|
+
file_type: str = 'nan',
|
|
346
|
+
) -> DictTextTable:
|
|
347
|
+
max_num = len(values)
|
|
348
|
+
if max_num < 1:
|
|
349
|
+
return cls.create_void_dict()
|
|
350
|
+
|
|
351
|
+
_items = [
|
|
352
|
+
ColumnBody(
|
|
353
|
+
ColumnsTable.KEY.value, ListString([f'{x}' for x in range(0, max_num)])
|
|
354
|
+
),
|
|
355
|
+
ColumnBody(
|
|
356
|
+
ColumnsTable.NUM_PAGE.value, ListString([page_num] * max_num)
|
|
357
|
+
),
|
|
358
|
+
ColumnBody(
|
|
359
|
+
ColumnsTable.NUM_LINE.value, ListString([f'{x+1}' for x in range(0, max_num)])
|
|
360
|
+
),
|
|
361
|
+
ColumnBody(
|
|
362
|
+
ColumnsTable.TEXT.value, ListString(values)
|
|
363
|
+
),
|
|
364
|
+
ColumnBody(
|
|
365
|
+
ColumnsTable.FILE_NAME.value, ListString([os.path.basename(file_path)] * max_num)
|
|
366
|
+
),
|
|
367
|
+
ColumnBody(
|
|
368
|
+
ColumnsTable.FILETYPE.value, ListString([file_type] * max_num)
|
|
369
|
+
),
|
|
370
|
+
ColumnBody(
|
|
371
|
+
ColumnsTable.FILE_PATH.value, ListString([file_path] * max_num)
|
|
372
|
+
),
|
|
373
|
+
ColumnBody(
|
|
374
|
+
ColumnsTable.DIR.value, ListString([dir_path] * max_num)
|
|
375
|
+
),
|
|
376
|
+
]
|
|
377
|
+
return cls(_items)
|
|
378
|
+
|
|
379
|
+
@classmethod
|
|
380
|
+
def create_from_file_text(cls, file: File) -> DictTextTable:
|
|
381
|
+
if not isinstance(file, File):
|
|
382
|
+
return cls.create_void_dict()
|
|
383
|
+
|
|
384
|
+
try:
|
|
385
|
+
with open(file.absolute(), 'rt') as f:
|
|
386
|
+
lines = ListString(f.readlines())
|
|
387
|
+
except Exception as e:
|
|
388
|
+
print(e)
|
|
389
|
+
return cls.create_void_dict()
|
|
390
|
+
else:
|
|
391
|
+
return cls.create_from_values(
|
|
392
|
+
lines,
|
|
393
|
+
file_type=file.extension(),
|
|
394
|
+
file_path=file.absolute(),
|
|
395
|
+
dir_path=file.dirname(),
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def concat_maps(list_map: list[DictTextTable]) -> DictTextTable:
|
|
400
|
+
if len(list_map) < 1:
|
|
401
|
+
return DictTextTable.create_void_dict()
|
|
402
|
+
_columns: HeadValues = list_map[0].columns
|
|
403
|
+
list_values: list[ColumnBody] = []
|
|
404
|
+
text_table: DictTextTable
|
|
405
|
+
col: ColumnBody
|
|
406
|
+
i: HeadCell
|
|
407
|
+
|
|
408
|
+
for i in _columns:
|
|
409
|
+
list_values.append(
|
|
410
|
+
ColumnBody(i, ListString([]))
|
|
411
|
+
)
|
|
412
|
+
for text_table in list_map:
|
|
413
|
+
for col in list_values:
|
|
414
|
+
col.extend(
|
|
415
|
+
text_table[col.col_name]
|
|
416
|
+
)
|
|
417
|
+
return DictTextTable(list_values)
|
|
399
418
|
|
|
400
419
|
|
|
401
420
|
|
|
@@ -13,7 +13,7 @@ from convert_stream.mod_types import (
|
|
|
13
13
|
get_hash_from_bytes, create_metadata, MetaDataFile, MetaDataItem
|
|
14
14
|
)
|
|
15
15
|
from convert_stream.mod_types.table_types import (
|
|
16
|
-
ListItems,
|
|
16
|
+
ListItems, concat_maps, DictTextTable, ColumnBody,
|
|
17
17
|
HeadCell, HeadValues, ColumnsTable
|
|
18
18
|
)
|
|
19
19
|
from convert_stream.mod_types.enums import LibPDF
|
|
@@ -42,7 +42,7 @@ class SearchableTextPdf(object):
|
|
|
42
42
|
"""
|
|
43
43
|
def __init__(self, silent: bool = False):
|
|
44
44
|
self.silent = silent
|
|
45
|
-
self.elements: dict[str, ColumnBody] =
|
|
45
|
+
self.elements: dict[str, ColumnBody] = DictTextTable.create_void_dict()
|
|
46
46
|
|
|
47
47
|
def __repr__(self):
|
|
48
48
|
return f'SearchableTextPdf: {self.elements}'
|
|
@@ -533,7 +533,7 @@ class DocumentPdf(object):
|
|
|
533
533
|
show_warning(f'{e}')
|
|
534
534
|
return _values
|
|
535
535
|
|
|
536
|
-
def _create_map(self, page: PageDocumentPdf, *, separator: str = '\n') ->
|
|
536
|
+
def _create_map(self, page: PageDocumentPdf, *, separator: str = '\n') -> DictTextTable:
|
|
537
537
|
"""
|
|
538
538
|
@rtype: pd.DataFrame
|
|
539
539
|
"""
|
|
@@ -544,11 +544,15 @@ class DocumentPdf(object):
|
|
|
544
544
|
_values = txt_page.split(separator)
|
|
545
545
|
|
|
546
546
|
if not self.metadata.file_path.is_empty:
|
|
547
|
-
return
|
|
548
|
-
_values,
|
|
547
|
+
return DictTextTable.create_from_values(
|
|
548
|
+
_values,
|
|
549
|
+
page_num=f'{page.number_page}',
|
|
550
|
+
file_type='.pdf',
|
|
551
|
+
file_path=self.metadata.file_path,
|
|
552
|
+
dir_path=self.metadata.dir_path,
|
|
549
553
|
)
|
|
550
554
|
else:
|
|
551
|
-
return
|
|
555
|
+
return DictTextTable.create_from_values(
|
|
552
556
|
_values,
|
|
553
557
|
page_num=f'{page.number_page}',
|
|
554
558
|
file_type='.pdf',
|
|
@@ -556,15 +560,15 @@ class DocumentPdf(object):
|
|
|
556
560
|
dir_path=self.metadata.dir_path,
|
|
557
561
|
)
|
|
558
562
|
|
|
559
|
-
def to_dict(self, separator: str = '\n') ->
|
|
560
|
-
list_data: list[
|
|
563
|
+
def to_dict(self, separator: str = '\n') -> DictTextTable:
|
|
564
|
+
list_data: list[DictTextTable] = []
|
|
561
565
|
pages: list[PageDocumentPdf] = self.to_pages()
|
|
562
566
|
|
|
563
567
|
for page_pdf in pages:
|
|
564
|
-
_mp:
|
|
568
|
+
_mp: DictTextTable = self._create_map(page_pdf, separator=separator)
|
|
565
569
|
list_data.append(_mp)
|
|
566
570
|
if len(list_data) == 0:
|
|
567
|
-
return
|
|
571
|
+
return DictTextTable.create_void_dict()
|
|
568
572
|
return concat_maps(list_data)
|
|
569
573
|
|
|
570
574
|
def to_data(self, separator: str = '\n') -> pd.DataFrame:
|
|
@@ -9,7 +9,7 @@ import pandas as pd
|
|
|
9
9
|
|
|
10
10
|
from convert_stream.mod_types.enums import LibPDF
|
|
11
11
|
from convert_stream.mod_types.table_types import (
|
|
12
|
-
|
|
12
|
+
DictTextTable, ListString, ColumnBody
|
|
13
13
|
)
|
|
14
14
|
from convert_stream.mod_types.modules import (
|
|
15
15
|
ModPagePdf, PageObject, fitz
|
|
@@ -230,9 +230,11 @@ class PageDocumentPdf(object):
|
|
|
230
230
|
return ListString([])
|
|
231
231
|
return ListString(txt.split(separator))
|
|
232
232
|
|
|
233
|
-
def to_dict(self, separator: str = '\n') ->
|
|
233
|
+
def to_dict(self, separator: str = '\n') -> DictTextTable:
|
|
234
234
|
_values = self.to_list(separator)
|
|
235
|
-
return
|
|
235
|
+
return DictTextTable.create_from_values(
|
|
236
|
+
_values, page_num=f'{self.number_page}', file_type='.pdf'
|
|
237
|
+
)
|
|
236
238
|
|
|
237
239
|
def to_map(self, separator: str = '\n') -> pd.DataFrame:
|
|
238
240
|
return pd.DataFrame.from_dict(self.to_dict(separator=separator)).astype('str')
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
from .date import ConvertStringDate
|
|
3
|
-
from .find_text import
|
|
2
|
+
from .date import ConvertStringDate, fmt_col_to_date
|
|
3
|
+
from .find_text import FindText
|
|
4
4
|
from .terminal import (
|
|
5
5
|
print_line, print_title, show_error, show_warning, show_info, Colors, msg
|
|
6
6
|
)
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
9
|
-
'ConvertStringDate', 'print_title', 'print_line',
|
|
9
|
+
'ConvertStringDate', 'print_title', 'print_line', 'fmt_col_to_date',
|
|
10
10
|
'show_info', 'Colors', 'show_error', 'show_warning', 'FindText',
|
|
11
|
-
]
|
|
11
|
+
]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
|
|
4
|
+
import pandas as pd
|
|
5
5
|
from convert_stream.mod_types.enums import LibDate
|
|
6
6
|
|
|
7
7
|
|
|
@@ -112,7 +112,7 @@ class ConvertStringDate(object):
|
|
|
112
112
|
"""
|
|
113
113
|
Verifica se o objeto atual é timestamp
|
|
114
114
|
"""
|
|
115
|
-
if isinstance(d, Timestamp):
|
|
115
|
+
if isinstance(d, pd.Timestamp):
|
|
116
116
|
return True
|
|
117
117
|
for current_format in self.date_valid_times_tamp:
|
|
118
118
|
try:
|
|
@@ -214,3 +214,40 @@ class ConvertStringDate(object):
|
|
|
214
214
|
return date_timestamp.strftime(fmt.value)
|
|
215
215
|
return None
|
|
216
216
|
|
|
217
|
+
|
|
218
|
+
def fmt_col_to_date(
|
|
219
|
+
df: pd.DataFrame,
|
|
220
|
+
nome_coluna: str, *,
|
|
221
|
+
date_fmt: LibDate = LibDate.DMY
|
|
222
|
+
) -> pd.DataFrame:
|
|
223
|
+
"""
|
|
224
|
+
Formata uma coluna específica de um DataFrame como data, preservando valores que não puderem ser convertidos.
|
|
225
|
+
|
|
226
|
+
Parâmetros:
|
|
227
|
+
df (pd.DataFrame): DataFrame de entrada.
|
|
228
|
+
nome_coluna (str): Nome da coluna a ser formatada.
|
|
229
|
+
formato (str): Tipo de formatação de data. Pode ser:
|
|
230
|
+
- "dia/mes/ano" → "%d/%m/%Y"
|
|
231
|
+
- "mes/dia/ano" → "%m/%d/%Y"
|
|
232
|
+
- "ano-mes-dia" → "%Y-%m-%d"
|
|
233
|
+
- ou um formato customizado válido do datetime.
|
|
234
|
+
|
|
235
|
+
Retorna:
|
|
236
|
+
pd.DataFrame: O mesmo DataFrame, com a coluna formatada.
|
|
237
|
+
"""
|
|
238
|
+
# Copia o DataFrame para não modificar o original
|
|
239
|
+
df_resultado = df.copy().astype('str')
|
|
240
|
+
|
|
241
|
+
def try_converter(valor) -> str:
|
|
242
|
+
"""Tenta converter o valor para data, preservando o original se falhar."""
|
|
243
|
+
try:
|
|
244
|
+
_new = ConvertStringDate().convert_date(valor, fmt=date_fmt)
|
|
245
|
+
except Exception as e:
|
|
246
|
+
return valor
|
|
247
|
+
else:
|
|
248
|
+
if _new is not None:
|
|
249
|
+
return _new
|
|
250
|
+
return valor
|
|
251
|
+
|
|
252
|
+
df_resultado[nome_coluna] = df_resultado[nome_coluna].apply(try_converter)
|
|
253
|
+
return df_resultado
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|