Слияние do DataFrames с отсутствующими строками - PullRequest
0 голосов
/ 13 июля 2020

Я хочу объединить два DataFrames:

df1:

               dt_object      Lng
1    2020-01-01 00:00:00  1.57423
2    2020-01-01 01:00:00  1.57444
3    2020-01-01 02:00:00  1.57465
4    2020-01-01 03:00:00  1.57486

df2:

               dt_object       Price
0    2020-01-03 10:00:00  256.086667
1    2020-01-03 11:00:00  256.526667
2    2020-01-03 12:00:00  257.386667
3    2020-01-03 13:00:00  256.703333
4    2020-01-03 14:00:00  255.320000

dt_object в обоих случаях имеет тип datetime64

df1 никогда не имеет пропущенных строк. Таким образом, у него 24 часа в сутки.

Но в df2 ЕСТЬ недостающие строки.

Когда я их объединяю, возникает несоответствие.

df = pd.merge(df1, df2, on = 'dt_object')

Объединенный df:

               dt_object      Lng       Price
0    2020-04-01 10:00:00  1.59270  183.996667
1    2020-04-01 11:00:00  1.59294  184.466667
2    2020-04-01 12:00:00  1.59319  184.810000
3    2020-04-01 13:00:00  1.59343  184.386667
4    2020-04-01 14:00:00  1.59367  184.533333

Проблемы:

  1. Lng 1.59270 находится не в том месте. Он прилетел 2020-04-01 10: 00: 00 от 04.01.2020 10: 00: 00 (месяц и дата перепутались). Но цена 183,996667 находится в нужном месте. Итак, ВСЕ Lng вылетели с неправильной даты с испорченной датой / месяцем.
  2. Цены в df2 начинаются с января 2020-01-03 10:00:00, но объединенный фрейм данных начинается с апреля 2020-04-01

Когда я увидел эту проблему, я добавил для обоих фреймов данных:

df1['dt_object'] = pd.to_datetime(df1['dt_object'], format='%Y-%m-%d %H:%M:%S')
df2['dt_object'] = pd.to_datetime(df2['dt_object'], format='%Y-%m-%d %H:%M:%S')

, но это не помогло. Ничего не изменилось. Внутри dt_object есть странная ошибка с месяцем / датой, но я не могу ее обнаружить. Помогите исправить, пожалуйста!

1 Ответ

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

Вы должны указать, что хотите выполнить левое соединение. Pandas Документация объясняет, какие различные варианты того, что будет делать параметр how.

>>> df1 = pd.DataFrame({'dt_object': pd.date_range('2020-01-01', '2020-01-04'), 'Lng': [0, 1, 2, 3]})
>>> df1
   dt_object  Lng
0 2020-01-01    0
1 2020-01-02    1
2 2020-01-03    2
3 2020-01-04    3

>>> df2 = pd.DataFrame({'dt_object': [pd.Timestamp('2020-01-01'), pd.Timestamp('2020-01-02'), pd.Timestamp('2020-01-04')], 'Price': [1000, 2000, 3000]})
>>> df2
   dt_object  Price
0 2020-01-01   1000
1 2020-01-02   2000
2 2020-01-04   3000

>>> df1.merge(df2, how='left')
   dt_object  Lng   Price
0 2020-01-01    0  1000.0
1 2020-01-02    1  2000.0
2 2020-01-03    2     NaN
3 2020-01-04    3  3000.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...