82 lines
2.1 KiB
Python
Executable File
82 lines
2.1 KiB
Python
Executable File
#!/home/florent/.conda/envs/sixp/bin/python
|
|
#/usr/bin/env python
|
|
# file csv.py
|
|
# author Florent Guiotte <florent.guiotte@irisa.fr>
|
|
# version 0.0
|
|
# date 27 sept. 2022
|
|
"""Abstract
|
|
|
|
doc.
|
|
"""
|
|
|
|
import sys
|
|
from timewreport.parser import TimeWarriorParser
|
|
import pandas as pd
|
|
import json
|
|
from pathlib import Path
|
|
|
|
FILTER_FILE = '~/.timewarrior/tag_filter.json'
|
|
# ["tag1", "tag2"]
|
|
|
|
|
|
def filter_tag(df, tag):
|
|
select = [tag in t for t in df.tags]
|
|
return df[select]
|
|
|
|
|
|
def get_tag_summary(df, tags):
|
|
summary_data = [(tag, filter_tag(df, tag).duration.sum()) for tag in tags]
|
|
summary = pd.DataFrame(summary_data, columns=['tag', 'time'])
|
|
duration_filter = [not not t for t in df.tags]
|
|
summary['ratio'] = summary.time / df[duration_filter].duration.sum()
|
|
|
|
return summary
|
|
|
|
|
|
def get_top_tag_summary(tag_summary, tags=None):
|
|
tags_top = tags if tags else set([t.split()[0] for t in tag_summary.tag])
|
|
|
|
top_data = []
|
|
for tag in tags_top:
|
|
top_df = summary[[tag == t.split()[0] for t in summary.tag]].sum()
|
|
top_df.tag = tag
|
|
top_data += [top_df]
|
|
|
|
return pd.DataFrame(top_data)
|
|
|
|
|
|
def get_timew_df():
|
|
parser = TimeWarriorParser(sys.stdin)
|
|
|
|
data = [(i.get_start(), i.get_end(), i.get_duration(), i.get_tags()) for i in parser.get_intervals()]
|
|
cols = ('start', 'end', 'duration', 'tags')
|
|
df = pd.DataFrame(data, columns=cols)
|
|
|
|
df.start = pd.to_datetime(df.start)
|
|
df.end = pd.to_datetime(df.end)
|
|
|
|
return df
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print(sys.stdin)
|
|
df = get_timew_df()
|
|
|
|
tags = set([t for tl in df.tags for t in tl])
|
|
|
|
summary = get_tag_summary(df, tags)
|
|
top_summary = get_top_tag_summary(summary)
|
|
|
|
with Path(FILTER_FILE).expanduser().open() as ff:
|
|
tag_filter = json.load(ff)
|
|
|
|
filtered_summary = get_top_tag_summary(summary, tag_filter)
|
|
|
|
|
|
for k, s in (('Detailed summary', summary),
|
|
('Top level summary', top_summary),
|
|
('Filtered summary', filtered_summary)):
|
|
print()
|
|
print(f'--- {k} ---')
|
|
print(s.sort_values(by=['ratio']).to_string(formatters={'ratio': '{:,.2%}'.format}))
|