如何在Python中绘制两个日期之间的时长数据可视化图表
核心结论
可以对Duration字段做可视化,但你当前得到的Duration是字符串格式,无法直接作为绘图的数值维度使用,需要先转换为可计算的数值型指标(比如总天数、总月数),之后用matplotlib、seaborn、plotly等任意常用可视化包都可以完成绘图。
第一步:数据预处理
优先直接用原始的两个TIMESTAMP类型字段计算间隔,精度更高,不需要从字符串格式的Duration做转换:
# 直接计算两个日期间隔的总天数,得到数值型字段 df['duration_days'] = (df['Last Bill Date'] - df['First Bill Date']).dt.days
如果只能从现有Duration字符串转换,可通过正则提取年、月、日数值后合并为总天数:
import re # 提取Duration中的年、月、日数值 df[['years', 'months', 'days']] = df['Duration'].str.extract(r'(\d+) Years (\d+) Months (\d+) Days').astype(int) # 近似计算总天数,每年按365天、每月按30.44天估算 df['duration_days'] = df['years'] * 365 + df['months'] * 30.44 + df['days']
常见可视化方案
根据你的分析目标可以选择不同的图表类型:
- 查看账单周期的分布情况:选择直方图、核密度估计图或者箱线图
import seaborn as sns import matplotlib.pyplot as plt # 直方图展示周期分布 sns.histplot(data=df, x='duration_days', bins=15) plt.xlabel('账单周期(天)') plt.ylabel('样本数量') plt.show() # 箱线图展示周期的离散程度和异常值 sns.boxplot(data=df, y='duration_days') plt.ylabel('账单周期(天)') plt.show()
- 查看账单周期随首单时间的变化趋势:选择折线图
# 按首单月份聚合,计算每月的平均账单周期 df['first_bill_month'] = df['First Bill Date'].dt.to_period('M').astype(str) monthly_avg_duration = df.groupby('first_bill_month')['duration_days'].mean().reset_index() sns.lineplot(data=monthly_avg_duration, x='first_bill_month', y='duration_days', marker='o') plt.xlabel('首单月份') plt.ylabel('平均账单周期(天)') plt.xticks(rotation=45) plt.show()
- 不同分组的周期对比:如果有用户类型、地区等分类维度,可选择分组柱状图、分组箱线图做对比分析。
注意事项
- 若你的数据中账单周期跨度极大(比如同时存在几天和几年的周期),可对
duration_days做对数转换后再绘图,避免极端值干扰可视化效果 - 原始字符串格式的
Duration可作为图表的标注信息使用,不适合直接作为坐标轴的数值字段
内容的提问来源于stack exchange,提问作者The Singularity
相关产品推荐
相关产品推荐

