From e2ed91c217355a642eeb417df8a7eaa198857903 Mon Sep 17 00:00:00 2001 From: Florent Guiotte Date: Tue, 27 Sep 2022 17:51:35 +0200 Subject: [PATCH] Initial commit --- csv_report.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100755 csv_report.py diff --git a/csv_report.py b/csv_report.py new file mode 100755 index 0000000..73885e5 --- /dev/null +++ b/csv_report.py @@ -0,0 +1,67 @@ +#!/home/florent/.conda/envs/sixp/bin/python +#/usr/bin/env python +# file csv.py +# author Florent Guiotte +# version 0.0 +# date 27 sept. 2022 +"""Abstract + +doc. +""" + +import sys +from timewreport.parser import TimeWarriorParser +import pandas as pd + + +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_top = 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__': + 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) + + for k, s in (('Detailed summary', summary), ('Top level summary', top_summary)): + print() + print(f'--- {k} ---') + print(s.to_string(formatters={'ratio': '{:,.2%}'.format}))