diff --git a/annofabcli/statistics/visualization/dataframe/actual_worktime.py b/annofabcli/statistics/visualization/dataframe/actual_worktime.py index a1e264b6..13519381 100644 --- a/annofabcli/statistics/visualization/dataframe/actual_worktime.py +++ b/annofabcli/statistics/visualization/dataframe/actual_worktime.py @@ -21,7 +21,19 @@ class ActualWorktime: columns = ["project_id", "date", "account_id", "actual_worktime_hour"] + @staticmethod + def required_columns_exist(df: pandas.DataFrame) -> bool: + """ + 必須の列が存在するかどうかを返します。 + + Returns: + 必須の列が存在するかどうか + """ + return len(set(ActualWorktime.columns) - set(df.columns)) == 0 + def __init__(self, df: pandas.DataFrame) -> None: + if not self.required_columns_exist(df): + ValueError(f"引数`df`には、{ActualWorktime.columns}の列が必要です。") self.df = df def is_empty(self) -> bool: diff --git a/annofabcli/statistics/visualize_statistics.py b/annofabcli/statistics/visualize_statistics.py index fa692e3a..d343501f 100644 --- a/annofabcli/statistics/visualize_statistics.py +++ b/annofabcli/statistics/visualize_statistics.py @@ -435,8 +435,16 @@ def main(self) -> None: if args.labor_csv is None: logger.warning("'--labor_csv'が指定されていないので、実績作業時間に関する情報は出力されません。") - - actual_worktime = ActualWorktime.from_csv(args.labor_csv) if args.labor_csv is not None else None + actual_worktime = ActualWorktime.empty() + else: + df_actual_worktime = pandas.read_csv(args.labor_csv) + if not ActualWorktime.required_columns_exist(df_actual_worktime): + logger.error( + "引数`--labor_csv`のCSVには以下の列が存在しないので、終了します。\n" + "`project_id`, `date`, `account_id`, `actual_worktime_hour`" + ) + sys.exit(COMMAND_LINE_ERROR_STATUS_CODE) + actual_worktime = ActualWorktime(df_actual_worktime) with tempfile.TemporaryDirectory() as str_temp_dir: main_obj = VisualizingStatisticsMain( @@ -568,7 +576,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None: "* date\n" "* account_id\n" "* actual_worktime_hour\n" - "* project_id (optional: ``--project_id`` に複数の値を指定したときは必須です) \n" + "* project_id \n" ), )