Разница между двумя датами в Excel возвращает отрицательное число

У меня есть сценарий для возврата разницы в днях между сегодняшней датой и датой в файле 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)

Я проверил остальные 100 дат в своих файлах Excel, и такое поведение наблюдается только для дат с одним номером. Например: 07.05.2019 (5 июля 2019 г.) или 10.03.2019 (3 ​​октября 2019 г.).

Это мой код:

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

Любая помощь была бы замечательной


person Daniel    schedule 17.06.2019    source источник
comment
Я думаю, что в первых двух случаях по умолчанию используется формат даты в США MM / DD / YYYY.   -  person IcedLance    schedule 17.06.2019
comment
@IcedLance Это действительно так, вы можете проверить с помощью print(pd.to_datetime("4/7/2019").month), который печатает 4. Для print(pd.to_datetime("20/8/2019").month) это 8.   -  person Lomtrur    schedule 17.06.2019


Ответы (2)


Используйте аргумент 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
person Erfan    schedule 17.06.2019
comment
Спасибо, но это не помогло - person Daniel; 17.06.2019
comment
Не могли бы вы уточнить немного больше, потому что, глядя на данные вашего примера, он это исправил. @DanielBeilin. Я отредактировал ваш код, не могли бы вы скопировать и вставить именно мой код и попробовать? - person Erfan; 17.06.2019
comment
Оказывается, проблема была вызвана форматированием в Excel, сам код работает. Поменял сортировку ячейки и теперь вроде все работает! Спасибо! @Efran - person Daniel; 17.06.2019
comment
Не волнуйся, рад, что смог помочь. Удачи с Python и Pandas. И не забудьте принять в качестве ответа, если мой ответ вам помог :) @DanielBeilin - person Erfan; 17.06.2019

Вы можете использовать аргумент format в to_datetime метод.

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
person Mateo Torres    schedule 17.06.2019
comment
Когда я передаю аргумент format="%d/%m/%Y", я получаю сообщение об ошибке: ValueError: time data datetime.datetime(2016, 6, 9, 0, 0) does not match format '%d/%m/%Y' (match) - person Daniel; 17.06.2019
comment
Эта ошибка выглядит так, как будто сохраненное значение уже является datetime. В этом случае вам, вероятно, придется обрабатывать каждый тип данных отдельно. Я бы посмотрел на apply метод - person Mateo Torres; 17.06.2019
comment
Оказывается, проблема была вызвана форматированием в Excel, сам код работает. Я изменил сортировку ячейки, и теперь вроде все работает! Спасибо! - person Daniel; 17.06.2019