timewarrior-extensions/csv_report.py
2022-09-29 15:36:19 +02:00

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