【问题标题】:Delta between two dates in Excel return negative numberExcel中两个日期之间的增量返回负数
【发布时间】:2019-10-30 21:41:05
【问题描述】:

我有一个脚本可以返回今天的日期和 Excel 文件中的日期之间的天数差异。

由于某种原因,对于单编号日期,我得到一个负数。

例如:

Date : num days diffrence from today

4/7/2019 : -72 (wrong)

5/7/2019 : -42 (wrong)

20/8/2019 : 63 (correct)

30/6/2019 : 12 (correct)

结果与发布此问题的那天一致 (17/6/2019)

我检查了 Excel 文件中剩余的 100 个日期,但这种行为只发生在单个编号的日期上。例如:2019 年 5 月 7 日(2019 年 7 月 5 日)或 2019 年 3 月 10 日(2019 年 10 月 3 日)。

这是我的代码:

import pandas as pd
import datetime as dt

file_name = pd.read_excel (r'Changes log.xlsx')
df = pd.DataFrame(file_name, columns= ['Due Date'])

today = pd.Timestamp.today()
df['Due Date'] = pd.to_datetime(df['Due Date'])
delta = (df['Due Date'] - today).dt.days
print(delta)

注意:df['Due Date] 包含 Excel 文件中的日期。格式为%d/%m/%Y

任何帮助都会很棒

【问题讨论】:

  • 我认为在前两种情况下,它默认为美国日期格式 MM/DD/YYYY
  • @IcedLance 确实如此,您可以使用打印4print(pd.to_datetime("4/7/2019").month) 进行验证。对于print(pd.to_datetime("20/8/2019").month),它是8

标签: python excel pandas date delta


【解决方案1】:

使用参数dayfirst=True

df = pd.read_excel('Changes log.xlsx')
df.columns = ['Due Date']

today = pd.Timestamp.today()
df['Due Date'] = pd.to_datetime(df['Due Date'], dayfirst=True)
delta = (df['Due Date'] - today).dt.days
print(delta)

数据示例:

df = pd.DataFrame({'Date': ['4/7/2019', '5/7/2019', '20/8/2019', '30/6/2019']})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

delta = (df['Date'] - pd.Timestamp.today()).dt.days

输出

0    16
1    17
2    63
3    12
Name: Date, dtype: int64

【讨论】:

  • 谢谢,但没有解决
  • 您能否详细说明一下,因为查看您的示例数据,它确实修复了它。 @丹尼尔贝林。我对您的代码进行了编辑,您可以复制并粘贴我的代码并尝试一下吗?
  • 原来问题是由 Excel 中的格式引起的,代码本身可以工作。我改变了单元格的排序,现在一切似乎都正常了!谢谢! @埃弗兰
  • 不用担心,很高兴我能帮上忙。祝 Python 和 Pandas 好运。如果我的回答对你有帮助,别忘了accept as answer :) @DanielBeilin
【解决方案2】:

您可以使用to_datetime 方法的format 参数。

df['Date'] = pd.to_datetime(df['Date'], format="%d/%m/%Y”)

完整示例:

df = pd.DataFrame({'Date': ['4/7/2019', '5/7/2019', '20/8/2019', '30/6/2019']})
df['Date'] = pd.to_datetime(df['Date'], format="%d/%m/%Y")
delta = (df['Date'] - pd.Timestamp.today()).dt.days
print(delta)

输出:

0    16
1    17
2    63
3    12
Name: Date, dtype: int64

【讨论】:

  • 当我传递 format="%d/%m/%Y" 参数时,我得到一个错误:ValueError: time data datetime.datetime(2016, 6, 9, 0, 0) does not match format '%d/%m/%Y' (match)
  • 该错误看起来像是存储的值已经是datetime。如果是这种情况,您可能需要分别处理每种数据类型。我会研究apply 方法
  • 原来问题是由 Excel 中的格式引起的,代码本身可以工作。我改变了单元格的排序,现在一切似乎都可以工作了!谢谢!
猜你喜欢
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多