Python日期时间差的计算(天/小时/分钟)及timedelta函数的使用(附python代码)

背景描述

数据分析中会遇到日期、时间的计算,主要包括以下几种情况:

  1. 对2个日期进行时间差值的计算或与目标时长进行比较,如:计算天数(days)、小时数(hours)、分钟数(minutes),秒数(seconds)等
  2. 对已知日期进行转换,增加或减少天数(days)、小时数(hours)等,如计算昨天的日期,半年后的日期等
  3. 提取日期中的年份、月份和日子等信息
    本文主要针对问题1和问题2,关于问题3,请查看博文:“python提取年月日遇到的问题”(链接:添加链接描述

解决方法:

  1. 对2个日期进行时间差值的计算:
    将日期都转换为datetime类 –》2个日期直接进行运算(如加减)–》对计算差值进行天数(days)和秒数(seconds)的提取
  2. 对已知日期进行转换,如增加或减少(天/小时/分钟):使用timedelta()函数来解决

示例代码(Python):

1. 对2个日期进行时间差值的计算

1.1 对直接输入的日期进行时间差计算

import numpy as np
import pandas as pd
from datetime import *

# 输入2个日期
date1 = "2022.05.11 13:30:00"
date2 = "2022.05.10 12:00:00"

# 将输入的日期转换为“datetime.datetime”类型
# 由于日期的类型是字符串,因此不能直接进行计算,会报错
date1 = datetime.strptime(date1, "%Y.%m.%d %H:%M:%S")
date2 = datetime.strptime(date2, "%Y.%m.%d %H:%M:%S")
print(" date1:", date1, "\n" ,"date2:", date2)
print(" 2个日期的类型分别是:\n", type(date1), type(date2))

在这里插入图片描述

# 计算时间差:时间差的类型为“datetime.timedelta”类型
duration = date1 - date2
duration

在这里插入图片描述

# 对计算差值进行天数(days)和秒数(seconds)的提取,并将秒数转换为小时数
day = duration.days
hour = duration.seconds/3600
print("days:", day)
print("hours:", hour)

在这里插入图片描述

小结:

  1. 由于计算的时间差需要精确到小时/分钟/秒等,因此需要将日期类型转换为“datetime.datetime类型”后进行计算。
  2. 运算得到的时间差值,其类型为“datetime.timedelta”,包括2部分:days: 多少天,seconds: 多少秒。
  3. 时间差值的提取:天数(days)= durations.days; 秒数(seconds)= durations.seconds,
    可根据提取出来的秒数再换算为多少小时或多少分钟。

1.2 DataFrame的时间差计算

import pandas as pd
from datetime import *

# 建立计算时间差的数据表(Dataframe)
li = [["2021-05-6 10:00:00", "2022-05-10 08:30:00"], 
      ["2022-05-7 08:30:00", "2022-05-10 12:30:00"], 
      ["2022-05-9 12:00:00", "2022-05-10 14:30:00"]]
df = pd.DataFrame(li, columns=["date1", "date2"])

# 将数据数据转换为“datetime.datetime类型”
df.date1 = df.date1.map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S"))
df.date2 = df.date2.map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S"))
df

在这里插入图片描述

# 计算时间差
df["duration"] = df.date2 - df.date1

# 对计算差值进行天数(days)和秒数(seconds)的提取,并将秒数转换为小时数
df["day"] = df.duration.map(lambda x: x.days)
df["hour"] = df.duration.map(lambda x: x.seconds/3600)
df

在这里插入图片描述

小结

  1. 在Dataframe中用同样的方法也能计算出两列日期时间的差值,包括天数和小时数,并且跨年度的计算也是可以的
  2. 日常工作中,可以使用提取出来的天数/小时数等与目标时长进行比较,建立效率评估指标(如:按时接收率%,商家正确揽收率%等)

2. 对已知日期进行增减计算(天/小时/分钟):使用timedelta()函数来解决

2.1 timedelta()函数的简介

timedelta()函数的构造:
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
对参数设定具体的值,达到计算的要求,如:
设定:days=1 – 在原有时间上增加1天;
设定:minutes=-30 – 在原有时间上减少30分钟

2.2 timedelta()函数的使用

# 1. timedelta()的基本用法
dt1 = datetime(2022, 5, 12, 8, 30, 0)
dt2 = dt1 + timedelta(days = 1)
dt3 = dt1 + timedelta(minutes = -30)
print("dt1:", dt1)
print("dt2:", dt2)
print("dt3:", dt3)

在这里插入图片描述

# 2. timedelta在dataframe中使用是,有广播的作用
li = [["2022-05-6 10:00:00", "2022-05-10 08:30:00"], 
      ["2022-05-7 08:30:00", "2022-05-10 12:30:00"], 
      ["2022-05-9 12:00:00", "2022-05-10 14:30:00"]]
df = pd.DataFrame(li, columns=["date1", "date2"])
df.date1 = df.date1.map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S"))
df.date2 = df.date2.map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S"))
df["var1"] = df.date1 + timedelta(hours=1)
df["var2"] = df.date2 + timedelta(days=30)
df

在这里插入图片描述

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年3月5日 下午5:28
下一篇 2023年3月5日 下午5:31

相关推荐