鱼C论坛

 找回密码
 立即注册
查看: 117|回复: 11

Python 处理Excel 终止日期减去起始日期的天数

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2025-09-07        2026-09-06
2025-09-07        2026-09-06
2025-09-07        2026-09-06
2025-09-07        2026-09-06
2025-09-07        2026-09-06
2025-09-07        2026-09-06
2025-09-07        2026-09-06



这种格式,如何计算天数?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
要计算Excel中终止日期减去起始日期的天数,可以使用Python的 pandas 库和 datetime 模块。以下是完整的解决方案:


  1. import pandas as pd
  2. from datetime import datetime

  3. # 读取Excel文件(假设数据在Sheet1中,且没有表头)
  4. df = pd.read_excel('your_file.xlsx', sheet_name='Sheet1', header=None)

  5. # 将两列转换为日期格式
  6. df[0] = pd.to_datetime(df[0])  # 起始日期列(第一列)
  7. df[1] = pd.to_datetime(df[1])  # 终止日期列(第二列)

  8. # 计算天数差(终止日期 - 起始日期)
  9. df[2] = (df[1] - df[0]).dt.days  # 结果保存在第三列

  10. # 保存结果到新Excel文件
  11. df.to_excel('result.xlsx', index=False, header=False)
复制代码


关键说明:
1. 使用 pd.to_datetime() 确保日期被正确解析
2. 日期相减得到 Timedelta 对象
3. 通过 .dt.days 提取天数数值
4. 结果会保存在第三列中

如果你的Excel文件有表头,需要修改 header 参数,并使用列名而不是数字索引。

注意:请先安装所需库:

  1. pip install pandas openpyxl
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
运行不了  报错AttributeError: 'DatetimeProperties' object has no attribute 'days'. Did you mean: 'day'?
删除,这个代码就正常运行
df[0] = pd.to_datetime(df[0])  # 起始日期列(第一列)
df[1] = pd.to_datetime(df[1])  # 终止日期列(第二列)

df[2] = (df[1] - df[0]).dt.days  # 结果保存在第三列
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
冰菲 发表于 2025-09-04 13:42
运行不了  报错AttributeError: 'DatetimeProperties' ...


您的代码报错是因为在处理日期列时方式不正确。`pd.to_datetime()` 应用于整个 DataFrame 时,返回的是日期格式的 DataFrame,但减法操作 `df - df` 会导致自己减自己(总是为0),且 `.dt.days` 不能直接用于整个 DataFrame。正确的方法是分别处理两列日期。

以下是修正后的代码,用于计算终止日期减去起始日期的天数:


  1. import pandas as pd

  2. # 读取Excel文件(假设没有表头,且数据在默认的Sheet1中)
  3. df = pd.read_excel('your_file.xlsx', header=None)

  4. # 将第一列(起始日期)和第二列(终止日期)转换为日期类型
  5. start_dates = pd.to_datetime(df[0])
  6. end_dates = pd.to_datetime(df[1])

  7. # 计算天数差:终止日期 - 起始日期
  8. days_diff = (end_dates - start_dates).dt.days

  9. # 将天数差添加到DataFrame的新列(例如第三列)
  10. df[2] = days_diff

  11. # 保存结果到新Excel文件(包含原数据和天数差)
  12. df.to_excel('result.xlsx', index=False, header=False)
复制代码


关键点:
- 使用 pd.to_datetime(df[0])pd.to_datetime(df[1]) 分别处理两列日期。
- 日期相减后得到 Timedelta 对象,使用 .dt.days 提取天数。
- 结果会保存在第三列,您可以根据需要调整输出。

如果只想保存天数差(而不保留原日期列),可以修改为:

  1. # 只保存天数差到新文件
  2. days_diff.to_frame().to_excel('result_days_only.xlsx', index=False, header=False)
复制代码


注意:请将 'your_file.xlsx' 替换为您的实际文件名。确保已安装 pandas 和 openpyxl 库:

  1. pip install pandas openpyxl
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
可能日期格式特殊吧,你这个代码运行不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
冰菲 发表于 2025-09-04 13:59
可能日期格式特殊吧,你这个代码运行不了


您的观察是正确的,我之前的代码确实有问题。对于特殊日期格式,我们需要更精确的处理方式。以下是修正后的代码,可以正确处理Excel中的日期计算:

import pandas as pd

# 读取Excel文件
df = pd.read_excel('your_file.xlsx', header=None)

# 分别处理两列日期
start_dates = pd.to_datetime(df.iloc[:, 0])  # 第一列作为起始日期
end_dates = pd.to_datetime(df.iloc[:, 1])   # 第二列作为终止日期

# 计算天数差
days_diff = (end_dates - start_dates).dt.days

# 将结果添加到原DataFrame
df[2] = days_diff

# 保存结果
df.to_excel('result.xlsx', index=False, header=False)

如果您的日期格式比较特殊,可能需要指定日期格式:

# 如果日期格式是"YYYY-MM-DD"
start_dates = pd.to_datetime(df.iloc[:, 0], format='%Y-%m-%d')
end_dates = pd.to_datetime(df.iloc[:, 1], format='%Y-%m-%d')

如果仍然有问题,可以先检查一下Excel中的日期是如何存储的:

print(df.head())  # 查看前几行数据
print(df.dtypes)  # 查看数据类型

如果Excel中的日期是字符串格式,可能需要先清理数据:

# 去除可能的空格
df.iloc[:, 0] = df.iloc[:, 0].str.strip()
df.iloc[:, 1] = df.iloc[:, 1].str.strip()

如果日期是Excel的序列号格式(数字),可以使用:

from datetime import datetime, timedelta
excel_origin = datetime(1899, 12, 30)  # Excel的起始日期

# 转换Excel序列号为日期
start_dates = [excel_origin + timedelta(days=x) for x in df.iloc[:, 0]]
end_dates = [excel_origin + timedelta(days=x) for x in df.iloc[:, 1]]

请根据您的实际情况选择合适的方法。如果仍有问题,可以提供更多关于日期格式的信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
2025/9/7 0:00:00

起始日期和终止日期 运行完都变成后缀到时间格式了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
冰菲 发表于 2025-09-04 14:27
2025/9/7 0:00:00

起始日期和终止日期 运行完都变 ...


您遇到的问题是Excel中的日期时间格式包含了时间部分(0:00:00),这导致了处理上的复杂性。以下是修正后的代码,专门处理这种包含时间的日期格式:

import pandas as pd

# 读取Excel文件
df = pd.read_excel('your_file.xlsx', header=None)

# 处理日期时间格式
# 将两列转换为日期时间格式,并提取日期部分
start_dates = pd.to_datetime(df.iloc[:, 0]).dt.date
end_dates = pd.to_datetime(df.iloc[:, 1]).dt.date

# 计算天数差(只计算日期部分)
days_diff = (end_dates - start_dates).dt.days

# 将结果添加到原DataFrame
df[2] = days_diff

# 保存结果
df.to_excel('result.xlsx', index=False, header=False)

如果您只想保留天数结果而不保留原始日期列:

# 只保存天数结果
result_df = pd.DataFrame(days_diff)
result_df.to_excel('result_days_only.xlsx', index=False, header=False)

如果您想查看处理后的日期格式,可以添加打印语句:

print("处理后的起始日期:")
print(start_dates.head())
print("\n处理后的终止日期:")
print(end_dates.head())
print("\n天数差:")
print(days_diff.head())

如果您的日期格式确实特殊(如"2025/9/7 0:00:00"),可能需要指定确切的格式:

# 指定日期时间格式
date_format = "%Y/%m/%d %H:%M:%S"
start_dates = pd.to_datetime(df.iloc[:, 0], format=date_format).dt.date
end_dates = pd.to_datetime(df.iloc[:, 1], format=date_format).dt.date

关键点:
- 使用 .dt.date 提取日期部分,忽略时间部分
- 确保使用正确的列索引(0和1分别表示第一列和第二列)
- 如果日期格式特殊,使用 format 参数明确指定

如果仍有问题,请尝试先查看原始数据的格式:

print(df.head())
print(df.dtypes)

这将帮助确定Excel中日期数据的实际存储方式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
太啰嗦了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层


使用pandas处理Excel日期计算天数差的简洁代码:

import pandas as pd

# 读取Excel文件
df = pd.read_excel('your_file.xlsx', header=None)

# 计算天数差
df = (pd.to_datetime(df.iloc) - pd.to_datetime(df.iloc)).dt.days

# 保存结果
df.to_excel('result.xlsx', index=False, header=False)

如果日期格式特殊,添加format参数:

df = (pd.to_datetime(df.iloc, format='%Y/%m/%d %H:%M:%S') -
      pd.to_datetime(df.iloc, format='%Y/%m/%d %H:%M:%S')).dt.days

这样就简洁多了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
不对
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层


简洁的解决方案:

import pandas as pd

df = pd.read_excel('your_file.xlsx', header=None)
df = (pd.to_datetime(df.iloc[:, 1]) - pd.to_datetime(df.iloc[:, 0])).dt.days
df.to_excel('result.xlsx', index=False, header=False)

如果日期格式特殊,添加format参数:
df = (pd.to_datetime(df.iloc[:, 1], format='%Y/%m/%d %H:%M:%S') -
      pd.to_datetime(df.iloc[:, 0], format='%Y/%m/%d %H:%M:%S')).dt.days

这样就简洁明了了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-8 12:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表