如何从日期列生成季度起始日期格式的新列?
问题描述
给定如下date列数据:
date 2019-05-11 2019-11-11 2020-03-01 2021-02-18
需要新增一列quarter,格式与date列一致,值为对应日期所在季度的起始日期,预期输出如下:
date | quarter 2019-05-11 2019-04-01 2019-11-11 2019-10-01 2020-03-01 2020-01-01 2021-02-18 2021-01-01
解决方案
以下是两种常用场景的实现方式:
一、Python Pandas 实现
可以通过时间周期转换或时间偏移两种方式处理:
方式1:基于季度周期对象
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'date': ['2019-05-11', '2019-11-11', '2020-03-01', '2021-02-18'] }) # 转为datetime类型 df['date'] = pd.to_datetime(df['date']) # 生成季度起始日期并格式化 df['quarter'] = df['date'].dt.to_period('Q').dt.start_time.dt.strftime('%Y-%m-%d') print(df)
- 逻辑说明:
dt.to_period('Q')将日期转为季度周期(如2019-05-11转为2019Q2),dt.start_time提取该季度的起始时间,最后用strftime统一格式。
方式2:基于时间偏移量
import pandas as pd df = pd.DataFrame({ 'date': ['2019-05-11', '2019-11-11', '2020-03-01', '2021-02-18'] }) df['date'] = pd.to_datetime(df['date']) # 计算季度起始日期 df['quarter'] = df['date'] - pd.offsets.QuarterBegin(startingMonth=1) # 按需转为字符串格式 df['quarter'] = df['quarter'].dt.strftime('%Y-%m-%d')
- 逻辑说明:
QuarterBegin(startingMonth=1)指定季度从1月开始(Q1:1-3月、Q2:4-6月等),用原日期减去偏移量直接得到季度起始日。
二、SQL 实现
不同数据库的写法略有差异,以下是主流数据库的实现:
MySQL
SELECT date, DATE_FORMAT( CONCAT(YEAR(date), '-', (QUARTER(date)-1)*3 + 1, '-01'), '%Y-%m-%d' ) AS quarter FROM your_table;
- 逻辑说明:
QUARTER(date)获取季度编号(1-4),通过计算得到季度起始月份,拼接为年-月-01格式后统一输出。
PostgreSQL
SELECT date, DATE_TRUNC('quarter', date)::DATE AS quarter FROM your_table;
- 逻辑说明:
DATE_TRUNC('quarter', date)直接将日期截断到季度起始时间,转为DATE类型后得到目标格式。
内容的提问来源于stack exchange,提问作者Chris90
相关产品推荐
相关产品推荐

