最近有个需求是要统计各个时间段的累计数值、时间段内的统计数值,涉及到日期、时间函数的处理较多,故趁今日整理一番
1.日期函数:relativedelta
relativedelta函数是dateutil库的一个类,可以用于日期之间的计算,精度可以到年、月、日、时、分、秒;
参数解释:day/month/year设置天日期/月份/年,days/months/years设置日期差异的天数/月差数/年数量
#导入relativedelta包用来计算月份差
from dateutil.relativedelta import relativedelta
#获取当前时间12个月之前的日期时间
start = datetime.now() - relativedelta(months = 12)
start
运行结果如下
#计算范围为datetime库的timedelta计算范围大一些,timedelta只满足日期之间的日、时、分、秒的计算,无法计算年、月
from datetime import datetime
from dateutil.relativedelta import relativedelta
print(datetime.now() + relativedelta(day = 1,month = 1,year = 2001)) #获取2001年1月1号的同样时刻,year、month、day为指定年份值、月份值、日期值
print(datetime.now() + relativedelta(days = 1,months = 1,years = 1)) #获取相隔1年+1月+1天后的日期及时间,years、months、days为指定年份差、月份差、天数差
运行结果
2.日期函数:timedelta函数
两个日期直接相减
from datetime import datetime,timedelta
def dayofyear(date):
try:
date_y = datetime.strptime(date,'%Y-%m-%d')
date_start = datetime.strptime(str(date_y.year)+'-01'+'-01',"%Y-%m-%d")
doy = (date_y - date_start).days + 1 #两个datetime日期变量相减结果是datetime.timedelta结果,需要借助.days方法输出天数数字
#datetime.timedelta,可用于时间的加减,参数为:weeks,days ,hours ,minutes,seconds
print(date,"是当年第",doy,"天,第二天日期是",(date_y + timedelta(days = 1)).strftime("%Y-%m-%d") )
except ValueError:
print("请输入合格的日期内容")
dayofyear('2024-09-01')
运行结果
- 日期函数:生成一个时间序列,可以使用pd.date_range函数实现,调用格式为:pd.data_range(开始日期,序列数量,日期频率)
months = pd.Series(pd.date_range(start, periods=12, freq='MS'))
#MS为每个月的月初第一天
#freq参数值有很多,如:Q-DEC为每个季度的最后一天;2Q-DEC为每个半年的第一天
months
运行结果
季度:每个季度的最后一天
年度:AS为每年的1月1日
4. 日期函数:日期类型转换
时间字符串转换为日期类型 — datetime.strptime(日期字符串,日期格式)
test = datetime.strptime('2024-11-01','%Y-%m-%d')
a = type(test)
print(test,'类型为',a)
运行结果
日期型转换为字符串 ---- datetime.strftime(日期格式内容,日期字符串格式)
test = datetime.strptime('2024-11-01','%Y-%m-%d')
test = test.strftime("%Y-%m-%d")
a = type(test)
print(test,'类型为',a)
运行结果