Pandas неверный результат to_datetime (разные типы для разных строк) - PullRequest
0 голосов
/ 06 августа 2020

Я использую to_datetime для форматирования данных для DataFrame следующим образом:

import pandas as pd
df = pd.read_csv('C:/Users/79219/Downloads/bd_with_names.csv', sep = ';')
from datetime import datetime, date 
df['data_posledney_pokupki']=df['data_posledney_pokupki'].str.split(' ').str.get(0)
df.head()
df['created_date']=df['created_date'].str.split(' ').str.get(0)
df.head()

до того, как я правильно изменю данные типов. Результат1:

    user_id created_date    summa_pokupok   kolichestvo_pokupok data_posledney_pokupki
0   0000186661  2018-05-15  760           1                      21.02.2020
1   21_0018542  2017-02-11  1899          1                      11.01.2020
2   17_0069595  2017-11-01  14606   13                           26.06.2020
3   14_0109526  2017-03-18  18334   4                            06.03.2020

после того, как я применил to_datetime

df['data_posledney_pokupki'] = pd.to_datetime(df['data_posledney_pokupki'],format="%Y/%m/%d") 
df['created_date'] = pd.to_datetime(df['created_date'])  
df.head()

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

0   0000186661  2018-05-15  760   1     2020-02-21
1   21_0018542  2017-02-11  1899    1   2020-11-01
2   17_0069595  2017-11-01  14606   13  2020-06-26
3   14_0109526  2017-03-18  18334   4   2020-06-03

Данные в строке [0] по-прежнему верны, но дата в строке [1] теперь неверна. Где ошибка?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Я удивлен, что это сработало для вас даже в тех случаях, когда это было.

format, который вы предоставляете, должен соответствовать спецификации c спецификации формата и вашей было неверно.

Я вижу, у вас есть 2 формата:

  1. 2018-05-15
  2. 21.02.2020

Я предполагаю, что ( 1) равно YYYY-MM-DD и (2) равно DD.MM.YYYY.

Следовательно, используя информацию, показанную в приведенной выше ссылке, вы должны пройти:

  1. format="%Y-%m-%d"
  2. format="%d.%m.%Y"

Примечание:

  • The %Y, %m, et c. являются спецификациями
  • Все остальное точно так же, как написано, поэтому вы используете -, если есть - и ., если есть ..
0 голосов
/ 06 августа 2020

Именно в этой строке. Вы не определили формат для строки даты.

# wrong
df['created_date'] = pd.to_datetime(df['created_date'])

# right
df['created_date'] = pd.to_datetime(df['created_date'], format="%Y-%m-%d")

То же самое относится и к другому столбцу даты, который вы конвертируете. Вы определили неверный формат. Вместо / ваш столбец фактической даты имеет . в качестве разделителя между годом, месяцем, днем, например. 2020.08.01. Он должен быть отражен в формате, который вы передаете, поэтому он станет %Y.%m.%d.

# wrong
df['data_posledney_pokupki'] = pd.to_datetime(df['data_posledney_pokupki'], format="%Y/%m/%d")

# right
df['data_posledney_pokupki'] = pd.to_datetime(df['data_posledney_pokupki'], format="%Y.%m.%d")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...