时间段

时间段指的是一段日期或时间。与时间段有关的问题,比如计算两个时间点之间相隔的天数或时间,或者给定一个起始日期和间隔天数求终止日期。[大谦Excel,dqexcel点com]

计算两个日期之间的间隔天数

【问题描述】

给定2个日期,计算二者之间的间隔天数。

【示例6-3】

本例使用的Excel文件的完整路径为“D:/Samples/ch06/时间段/计算两个日期之间的间隔天数/身份证号.xlsx”。该文件打开后如图6-3所示,请根据身份证号计算所有人员的年龄。

Document Image

图6-3 身份证信息

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件数据
file_path = r'D:/Samples/ch06/时间段/计算两个日期之间的间隔天数/身份证号.xlsx'
df = pd.read_excel(file_path, engine='openpyxl', usecols='A:C', nrows=8)
# 计算所有人员的年龄并将其添加到“年龄”列
df['出生日期'] = df['身份证'].str[6:14]  # 获取出生日期,即身份证号中第7-14个字符
current_date = pd.to_datetime('today')  # 获取当前日期
df['年龄'] = ((current_date - pd.to_datetime(df['出生日期'], format='%Y%m%d')) / pd.Timedelta(days=365)).astype(int)  # 计算得到年龄,并转换为整型
# 输出修改后的表数据
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出添加出生日期和年龄列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
   序号 姓名                 身份证      出生日期  年龄
0   1  A  522324197403081***  19740308  49
1   2  B  522324198302051***  19830205  40
2   3  C  522324200701225***  20070122  16
3   4  D  522324201001181***  20100118  13
4   5  E  522324201803011***  20180301   5
5   6  F  522324197109211***  19710921  51
6   7  G  522324196706011***  19670601  56
7   8  H  522324199210161***  19921016  30

【知识点扩展】

本例中通过对身份证号字符串进行切片得到出生日期,然后用pandas的to_datatime(‘today’)得到当前日期,当前日期减去出生日期,得到年龄,取整数。

注意,本例代码中,两个日期相减得到的是它们之间间隔的天数,即

code.python
>>> current_date - pd.to_datetime(df['出生日期'], format='%Y%m%d')
0   17983 days 10:06:03.156163
1   14727 days 10:06:03.156163
2    5975 days 10:06:03.156163
3    4883 days 10:06:03.156163
4    1919 days 10:06:03.156163
5   18882 days 10:06:03.156163
6   20455 days 10:06:03.156163
7   11186 days 10:06:03.156163
Name: 出生日期, dtype: timedelta64[ns]

所以计算年龄,还需要将间隔天数除以一年365天,即

code.python
(current_date - pd.to_datetime(df['出生日期'], format='%Y%m%d')) / pd.Timedelta(days=365)

然后取整数。

上面数据类型timedelta64表示时间段。

已知起始日期和间隔天数计算终止日期

【问题描述】

给定起始日期和间隔天数,要求计算终止日期。

【示例6-4】

本例使用的Excel文件的完整路径为“D:/Samples/ch06/时间段/已知起始日期和间隔天数计算终止日期/图书借阅.xlsx”。该文件打开后如图6-4所示,请根据计算每本书的还书日期并添加到”还书日期“列。

Document Image

图6-4 图书借阅

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件的第一个工作表中A-C列数据,引擎为"openpyxl"
df = pd.read_excel("D:/Samples/ch06/时间段/已知起始日期和间隔天数计算终止日期/图书借阅.xlsx", usecols="A:C", engine="openpyxl")
# 计算还书日期并添加到”还书日期“列
df["还书日期"] = df["借书日期"].apply(lambda x: x.replace(day=x.day, month=x.month+2))
# 去掉时间,只保留日期
df["还书日期"] = pd.to_datetime(df["还书日期"]).dt.date
# 输出修改后的表数据
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出添加还书日期后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名         图书       借书日期        还书日期
0  张满江      《红楼梦》 2023-04-12  2023-06-12
1   李俊    《唐诗三百首》 2023-04-18  2023-06-18
2  吴尚功    《普希金诗选》 2023-05-02  2023-07-02
3  龚步珍  《C++程序设计》 2023-05-17  2023-07-17
4  房一笑        《飘》 2023-05-25  2023-07-25

【知识点扩展】

本例用Series对象的replace方法计算还书日期,该方法用一个匿名函数给日期时间数据中的月份值加2,得到还书日期。