Python:strftime()函数可以处理季度日期转换吗?
我需要在Python中处理大量的日期格式转换。输入日期格式可能类似于字符串类型中的Python:strftime()函数可以处理季度日期转换吗?,python,date,datetime,strptime,Python,Date,Datetime,Strptime,我需要在Python中处理大量的日期格式转换。输入日期格式可能类似于字符串类型中的“2018/07/07”。使用datetime。()函数将其转换为'2018-07-07T00:00:00'。然而,一些特殊的日期格式可能会让我很担心,比如“2018Q1”,这意味着2018年第一季度 我发现strftime函数中没有任何东西可以用来描述季度。 我试过: 我真正想要的是'2018-03-01T00:00:00'或'2018-03-31T00:00:00'让我知道,好了,现在是季度日期 进一步关注:
“2018/07/07”
。使用datetime。()函数将其转换为'2018-07-07T00:00:00'
。然而,一些特殊的日期格式可能会让我很担心,比如“2018Q1”
,这意味着2018年第一季度
我发现strftime函数中没有任何东西可以用来描述季度。
我试过:
我真正想要的是'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
我会看一看。它似乎支持带有
%q
@HernánAlarcón的四分之一。这是一个很好的建议,但是,输入实际上来自一个嵌套的json文件,一旦我规范化了所有日期,我需要将结果返回到json。我担心如果它太复杂和耗时,首先转换为pd,然后找出它并进行处理,最后返回dict格式。非常感谢!真的很感激!
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