You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从日期列生成季度起始日期格式的新列?

问题描述

给定如下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:05:14