Python: strftime() 函数可以处理季度日期转换吗?

Python: Can strftime() function deal with Quarter date transform?

我需要处理 Python 中的大量日期格式转换。输入的日期格式可能像 "2018/07/07" in type string。使用 datetime.() 函数很容易将其转换为 '2018-07-07T00:00:00'。然而,一些特殊的日期格式可能让我很担心,比如 "2018Q1",这意味着 2018 年第一季度。

我发现在strftime函数中没有什么可以用来描述季度的。 我试过了:

import time, datetime
time_original = "2018Q1"
time_format = datetime.datetime.strptime(time_original,"%YQ%m")
time_format = time_format.strftime('%Y-%m-%dT%H:%M:%S')
print(time_format)

output:
'2018-01-01T00:00:00'

我真正想要的是 '2018-03-01T00:00:00''2018-03-31T00:00:00' 让我知道,好的,这是季度日期。

进一步关注: 由于某些日期格式可能像'18/07',使用该函数只能显示月的第一天'2018-07-01T00:00:00',而不能显示月的最后一天。如果输入日期没有“天”,我想在一个月的最后一天对所有数据进行标准化。

回答问题:不,据我所知没有。提供替代方案:您可以使用 pandas.to_datetime 自动解析季度,例如

import pandas as pd
print(pd.to_datetime("2018Q1").isoformat())
# 2018-01-01T00:00:00

...或编写您自己的解析器,例如

from datetime import datetime

def year_quarter_to_ymd(s):
    parts = s.upper().split('Q')
    dt = datetime(int(parts[0]), int(parts[1])*3-2, 1)
    return dt.isoformat()

tstrings = ["2018Q1","2018Q2","2018Q3","2018Q4"]

for t in tstrings:
    print(year_quarter_to_ymd(t))
    
# 2018-01-01T00:00:00
# 2018-04-01T00:00:00
# 2018-07-01T00:00:00
# 2018-10-01T00:00:00  

虽然不太方便,但自定义函数在我的机器上运行速度更快:

%timeit pd.to_datetime("2018Q1").isoformat()
69.1 µs ± 289 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit year_quarter_to_ymd("2018Q1")
1.32 µs ± 3.01 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

确实有效!非常感谢@MrFuppes,根据他的回答,我尝试使用 calendar 函数自动找出最后一天。它也有效!在此更新结果:

from datetime import datetime
import calendar

def year_quarter_to_ymd(s):
    parts = s.upper().split('Q')
    end = calendar.monthrange(int(parts[0]), int(parts[1])*3)[1]
    dt = datetime(int(parts[0]), int(parts[1])*3, end)
    return dt.isoformat()

print(year_quarter_to_ymd("2019Q1"))

#2019-03-31T00:00:00