Skip to content

Commit 8896377

Browse files
Haoxi2002Haoxi2002
andauthored
Fix: 修复零花费的日期错误显示的问题 (#9)
Co-authored-by: Haoxi2002 <shurenliu@tju.edu.cn>
1 parent 938a4b3 commit 8896377

1 file changed

Lines changed: 33 additions & 6 deletions

File tree

src/tju_expense/analyze.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,27 @@ def analyze(df_file, title, save_to):
6767

6868
def plot_consumption_heatmap(df, ax, title):
6969
"""绘制消费热力图"""
70+
# 构造时间周期
71+
max_date = df['time'].max().date()
72+
start_of_year = pd.to_datetime(max_date.year * 10000 + 101, format='%Y%m%d').date()
73+
full_date_range = pd.date_range(start=start_of_year, end=max_date, freq='D')
74+
75+
# 将未消费的天补一条值为0的消费,并按天累加
76+
daily_sum = (
77+
df.assign(date=df['time'].dt.normalize()) # 将 time 转成日期
78+
.groupby('date')['amount']
79+
.sum()
80+
.reindex(full_date_range, fill_value=0) # 用完整日期索引补齐缺失天数
81+
.reset_index()
82+
)
83+
daily_sum.columns = ['time', 'amount']
84+
7085
# 准备数据
71-
df['weekday'] = df['time'].dt.weekday
72-
df['week'] = df['time'].dt.isocalendar().week
86+
daily_sum['weekday'] = daily_sum['time'].dt.weekday
87+
daily_sum['week'] = daily_sum['time'].dt.isocalendar().week
7388

74-
# 计算每天的消费总额
75-
daily_consumption = df.pivot_table(
89+
# 转换为透视表
90+
daily_consumption = daily_sum.pivot_table(
7691
values='amount',
7792
index='weekday',
7893
columns='week',
@@ -103,8 +118,20 @@ def plot_consumption_heatmap(df, ax, title):
103118

104119
def plot_daily_trend(df, ax):
105120
"""绘制每日消费趋势图"""
106-
# 计算每日消费总额
107-
daily_sum = df.groupby(df['time'].dt.date)['amount'].sum().reset_index()
121+
# 构造时间周期
122+
max_date = df['time'].max().date()
123+
start_of_year = pd.to_datetime(max_date.year * 10000 + 101, format='%Y%m%d').date()
124+
full_date_range = pd.date_range(start=start_of_year, end=max_date, freq='D')
125+
126+
# 将未消费的天补一条值为0的消费,并按天累加
127+
daily_sum = (
128+
df.assign(date=df['time'].dt.normalize()) # 将 time 转成日期
129+
.groupby('date')['amount']
130+
.sum()
131+
.reindex(full_date_range, fill_value=0) # 用完整日期索引补齐缺失天数
132+
.reset_index()
133+
)
134+
daily_sum.columns = ['time', 'amount']
108135

109136
# 计算7日移动平均线
110137
daily_sum['MA7'] = daily_sum['amount'].rolling(

0 commit comments

Comments
 (0)