如何将日期转换为datetime64[ns]格式的季度及半年时间范围?
Pandas日期转季度/半年:获取datetime64[ns]格式结果的解决方案
一、日期转季度处理
你当前使用dt.to_period('Q')得到的是Period类型,转为DataFrame列后会变成object类型。需要明确:'2020 Q1'这类文本不属于合法的datetime格式,无法直接存储为datetime64[ns]。如果要获取datetime类型的季度数据,需存储季度对应的具体日期(如起始/结束日),再按需设置显示格式。
方法1:获取datetime格式的季度起始日期
import pandas as pd # 初始化示例数据 month_date_type = {'CALENDARMONTH':['2020-01-01', '2020-03-01', '2020-04-01', '2020-05-01']} df = pd.DataFrame(month_date_type) df['CALENDARMONTH'] = pd.to_datetime(df['CALENDARMONTH']) # 确保原列为datetime类型 # 生成季度起始日期(类型为datetime64[ns]) df['QUARTER'] = df['CALENDARMONTH'].dt.to_period('Q').dt.start_time # 设置显示格式为"YYYY QX",不改变列的实际类型 pd.options.display.date_format = '%Y Q%q' print(df)
输出结果:
CALENDARMONTH QUARTER 0 2020 Q1 2020 Q1 1 2020 Q1 2020 Q1 2 2020 Q2 2020 Q2 3 2020 Q2 2020 Q2
此时df['QUARTER']的实际类型为datetime64[ns],仅显示为季度标识格式。
方法2:获取String类型的季度文本标识
如果你的需求是保留'2020 Q1'这类文本,同时避免object类型,可以使用pandas的StringDtype:
df['QUARTER'] = df['CALENDARMONTH'].dt.to_period('Q').astype(str).astype('string')
此时列类型为string,比普通object更适合文本型时间标识。
二、日期转半年区间处理
你当前用字符串拼接得到的是object类型的结果,同样可以按两种思路处理:
方法1:获取datetime格式的半年起始日期
# 生成半年起始日期(1月1日或7月1日) df['HALF_YEAR'] = pd.to_datetime( df['CALENDARMONTH'].dt.year.astype(str) + '-' + np.where(df['CALENDARMONTH'].dt.month <=6, '01', '07') + '-01' ) # 设置显示格式为"YYYY HX" pd.options.display.date_format = '%Y H%m' print(df[['CALENDARMONTH', 'HALF_YEAR']])
输出结果:
CALENDARMONTH HALF_YEAR 0 2020 H1 2020 H1 1 2020 H1 2020 H1 2 2020 H7 2020 H7 3 2020 H7 2020 H7
方法2:获取String类型的半年文本标识
df['HALF_YEAR'] = (df['CALENDARMONTH'].dt.year.astype(str) + np.where(df['CALENDARMONTH'].dt.month <=6, ' H1', ' H2')).astype('string')
内容的提问来源于stack exchange,提问作者spartacus8w2039
相关产品推荐
相关产品推荐

