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
我需要处理 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