如何生成日期与Git提交记录列表?如何生成GitHub贡献统计CSV?
我来帮你逐个解决这两个问题:
1. 生成日期与Git提交记录的列表
分两种场景给出实现方式,按需选择:
场景1:列出每个提交的日期与详情
使用git log的格式化输出功能,直接生成包含日期、提交哈希和提交信息的列表:
git log --pretty=format:"%ad | %h | %s" --date=short
%ad:显示作者提交日期--date=short:将日期统一格式化为YYYY-MM-DD,避免冗余的时间信息%h:提交的短哈希值(方便快速定位提交)%s:提交的标题信息
如果需要将结果保存为文件,直接重定向即可:
git log --pretty=format:"%ad | %h | %s" --date=short > git_commits_list.txt
场景2:按日期统计每日提交次数
如果需要统计每天的提交总数,用以下命令组合:
git log --pretty=format:"%ad" --date=short | sort | uniq -c
输出格式为次数 日期,比如5 2024-05-20表示5月20日有5次提交。
如果要直接生成CSV格式(日期在前,次数在后),用awk调整格式:
git log --pretty=format:"%ad" --date=short | sort | uniq -c | awk '{print $2","$1}' > git_commits_by_date.csv
2. 从时间戳CSV生成日期-贡献次数的CSV
假设你的原CSV每行格式为时间戳,无符号值(比如1716182400,3),这里提供两种简便实现方式:
方法一:Python标准库实现(无需额外依赖)
写一段轻量脚本,处理逻辑清晰,适合小数据量:
import csv from datetime import datetime # 替换为你的输入输出文件路径 input_file = "your_source.csv" output_file = "contributions_result.csv" date_stats = {} with open(input_file, 'r') as in_csv: reader = csv.reader(in_csv) # 如果原CSV有表头,取消下面一行的注释跳过表头 # next(reader) for row in reader: timestamp = int(row[0]) # 转换时间戳为YYYY-MM-DD格式(用utcfromtimestamp或fromtimestamp切换时区) date = datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d") # 统计每日贡献次数(每一行算一次贡献) if date in date_stats: date_stats[date] += 1 else: date_stats[date] = 1 # 如果需要统计无符号值的总和,替换上面的统计代码为: # value = int(row[1]) # date_stats[date] = date_stats.get(date, 0) + value # 将结果写入CSV with open(output_file, 'w', newline='') as out_csv: writer = csv.writer(out_csv) writer.writerow(["date", "contributions"]) # 写入表头 # 按日期排序后写入 for sorted_date in sorted(date_stats.keys()): writer.writerow([sorted_date, date_stats[sorted_date]])
方法二:Pandas实现(简洁高效,适合大数据量)
如果已经安装了Pandas,代码会更简洁:
import pandas as pd input_file = "your_source.csv" output_file = "contributions_result.csv" # 读取CSV,names参数替换为你的原CSV列名(如果有表头可省略) df = pd.read_csv(input_file, names=["timestamp", "value"]) # 将时间戳转换为日期格式 df["date"] = pd.to_datetime(df["timestamp"], unit='s').dt.strftime("%Y-%m-%d") # 统计每日贡献次数 result = df.groupby("date").size().reset_index(name="contributions") # 如果需要统计无符号值总和,替换为: # result = df.groupby("date")["value"].sum().reset_index(name="contributions") # 保存为CSV result.to_csv(output_file, index=False)
内容的提问来源于stack exchange,提问作者Korgan Rivera




