Преобразование импортированных дат из .txt в формат даты python - PullRequest
0 голосов
/ 12 июля 2020

У меня проблемы с преобразованием дат в импортированном файле .txt, и мне интересно, что я делаю не так.

Я импортирую данные по:

df_TradingMonthlyDates = pd.read_csv(TradingMonthlyDates, dtype=str, sep=',') # header=True,

, и это выглядит как в следующей таблице (даты представляют начало / конец месяца и имеют заголовок Date):

           Date
0    2008-12-30
1    2008-12-31
2    2009-01-01
3    2009-01-02
4    2009-01-29
..          ...

557  2020-06-29
558  2020-06-30
559  2020-07-01
560  2020-07-02
561  2020-07-30
..          ...

624  2021-11-30
625  2021-12-01
626  2021-12-02
627  2021-12-30
628  2021-12-31

[629 rows x 1 columns]
<class 'pandas.core.frame.DataFrame'>

Затем я вычисляю сегодняшнюю дату:

df_EndDate = datetime.now().date()

Я пытаюсь применить данные выше в этой функции, чтобы получить ближайшую дату до заданной даты (данная дата = сегодняшняя дата в моем случае):

# https://stackoverflow.com/questions/32237862/find-the-closest-date-to-a-given-date
def nearest(items, pivot):
    return min([i for i in items if i < pivot], key=lambda x: abs(x - pivot))

date_output = nearest(df_TradingMonthlyDates, df_EndDate)
# date_output should be = 2020-07-02 given today's date of 2020-07-12

Сообщения об ошибках, которые я получаю, заключаются в том, что df_TradingMonthlyDates не соответствует дате формат. Итак, я попытался преобразовать фрейм данных в формат datetime, но не могу заставить его работать.

То, что я пытался преобразовать данные в формат даты:

# df_TradingMonthlyDates["Date"] = pd.to_datetime(df_TradingMonthlyDates["Date"], format="%Y-%m-%d")
# df_TradingMonthlyDates = datetime.strptime(df_TradingMonthlyDates, "%Y-%m-%d").date()
# df_TradingMonthlyDates['Date'] = df_TradingMonthlyDates['Date'].apply(lambda x: pd.to_datetime(x[0], format="%Y-%m-%d"))
# df_TradingMonthlyDates = df_TradingMonthlyDates.iloc[1:]
# print(df_TradingMonthlyDates)
# df_TradingMonthlyDates = datetime.strptime(str(df_TradingMonthlyDates), "%Y-%m-%d").date()
# for line in split_source[1:]: # skip the first line

Код :

import pandas as pd
from datetime import datetime
 
# Version 1

TradingMonthlyDates = "G:/MonthlyDates.txt"

# Import file where all the first/end month date exists
df_TradingMonthlyDates = pd.read_csv(TradingMonthlyDates, dtype=str, sep=',') # header=True,
print(df_TradingMonthlyDates)

# https://community.dataquest.io/t/datetime-and-conversion/213425
# df_TradingMonthlyDates["Date"] = pd.to_datetime(df_TradingMonthlyDates["Date"], format="%Y-%m-%d")
# df_TradingMonthlyDates = datetime.strptime(df_TradingMonthlyDates, "%Y-%m-%d").date()
# df_TradingMonthlyDates['Date'] = df_TradingMonthlyDates['Date'].apply(lambda x: pd.to_datetime(x[0], format="%Y-%m-%d"))
# df_TradingMonthlyDates = df_TradingMonthlyDates.iloc[1:]
# print(df_TradingMonthlyDates)
# df_TradingMonthlyDates = datetime.strptime(str(df_TradingMonthlyDates), "%Y-%m-%d").date()
# for line in split_source[1:]: # skip the first line # maybe header is the problem
print(type(df_TradingMonthlyDates))
df_TradingMonthlyDates = df_TradingMonthlyDates.datetime.strptime(df_TradingMonthlyDates, "%Y-%m-%d")
df_TradingMonthlyDates = df_TradingMonthlyDates.time()


print(df_TradingMonthlyDates)

df_EndDate = datetime.now().date()
print(type(df_EndDate))



# https://stackoverflow.com/questions/32237862/find-the-closest-date-to-a-given-date
def nearest(items, pivot):
    return min([i for i in items if i < pivot], key=lambda x: abs(x - pivot))

date_output = nearest(df_TradingMonthlyDates, df_EndDate)

Сообщения об ошибках различаются в зависимости от того, как я пытался преобразовать тип данных, но я считаю, что все они замечают, что мой формат даты не работает:

df_TradingMonthlyDates = df_TradingMonthlyDates.datetime.strptime(df_TradingMonthlyDates, "%Y-%m-%d")

Traceback (most recent call last):
  File "g:/till2.py", line 25, in <module>
    df_TradingMonthlyDates = df_TradingMonthlyDates.datetime.strptime(df_TradingMonthlyDates, "%Y-%m-%d")
  File "C:\Users\ID\AppData\Roaming\Python\Python38\site-packages\pandas\core\generic.py", line 5274, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'datetime'

df_TradingMonthlyDates["Date"] = pd.to_datetime(df_TradingMonthlyDates["Date"], format="%Y-%m-%d")

Traceback (most recent call last):
  File "g:/till2.py", line 40, in <module>
    date_output = nearest(df_TradingMonthlyDates, df_EndDate)
  File "g:/till2.py", line 38, in nearest
    return min([i for i in items if i < pivot], key=lambda x: abs(x - pivot))
  File "g:/till2.py", line 38, in <listcomp>
    return min([i for i in items if i < pivot], key=lambda x: abs(x - pivot))
TypeError: '<' not supported between instances of 'str' and 'datetime.date'

1 Ответ

1 голос
/ 12 июля 2020

Edit: добавлен метод 3, который может быть самым простым с помощью .loc, а затем .iloc

. Вы можете использовать немного другой подход (с помощью метода № 1 или метода № 2 ниже), выбрав абсолютный минимум разницы между сегодняшней датой и данными, но ключевой вещью, которую вы не делали, было обертывание pd.to_datetime() вокруг datetime.date объекта df_EndDate, чтобы преобразовать его в DatetimeArray, чтобы он мог быть по сравнению с вашим столбцом Date. Оба они должны быть в одном формате DatetimeArray для сравнения.

Метод 1:

import pandas as pd
import datetime as dt
df_TradingMonthlyDates = pd.DataFrame({'Date': {'0': '2008-12-30',
  '1': '2008-12-31',
  '2': '2009-01-01',
  '3': '2009-01-02',
  '4': '2009-01-29',
  '557': '2020-06-29',
  '558': '2020-06-30',
  '559': '2020-07-01',
  '560': '2020-07-02',
  '561': '2020-07-30',
  '624': '2021-11-30',
  '625': '2021-12-01',
  '626': '2021-12-02',
  '627': '2021-12-30',
  '628': '2021-12-31'}})

df_TradingMonthlyDates['Date'] = pd.to_datetime(df_TradingMonthlyDates['Date'])
df_TradingMonthlyDates['EndDate'] = pd.to_datetime(dt.datetime.now().date())
df_TradingMonthlyDates['diff'] = (df_TradingMonthlyDates['Date'] - df_TradingMonthlyDates['EndDate'])
a=min(abs(df_TradingMonthlyDates['diff']))
df_TradingMonthlyDates = df_TradingMonthlyDates.loc[(df_TradingMonthlyDates['diff'] == a)
                                                    | (df_TradingMonthlyDates['diff'] == -a)]
df_TradingMonthlyDates

вывод 1:

    Date        EndDate     diff
560 2020-07-02  2020-07-11  -9 days

Если вам не нужны дополнительные столбцы и только дата, а затем назначьте переменные для создания серий, а не новых столбцов:

Метод 2:

d = pd.to_datetime(df_TradingMonthlyDates['Date'])
t = pd.to_datetime(dt.datetime.now().date())
e = (d-t)
a=min(abs(e))
df_TradingMonthlyDates = df_TradingMonthlyDates.loc[(e == a) | (e == -a)]
df_TradingMonthlyDates

вывод 2:

    Date
560 2020-07-02

Метод 3:

df_TradingMonthlyDates['Date'] = pd.to_datetime(df_TradingMonthlyDates['Date'])
date_output = df_TradingMonthlyDates.sort_values('Date') \
              .loc[df_TradingMonthlyDates['Date'] <= 
pd.to_datetime(dt.datetime.now().date())] \
              .iloc[-1,:]
date_output

вывод 3:

Date   2020-07-02
Name: 560, dtype: datetime64[ns]
...