объединить два кадра данных на основе ближайшей даты и времени - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть два набора данных, один из которых содержит данные о качестве воздуха, а другой - данные о погоде, каждый из которых содержит столбец с именем «dt» для даты и времени.Однако эти времена не совпадают точно.Я хотел бы присоединиться к этим таблицам, чтобы данные о качестве воздуха сохранялись, а самое близкое время данных о погоде сопоставлялось и объединялось.

df_aq:

                  dt   Latitude  Longitude  ...   Speed_kmh  PM2.5  PM10
0    11/20/2018 12:16  33.213922 -97.151055  ...        0.35   16.0  86.1
1    11/20/2018 12:16  33.213928 -97.151007  ...        5.01   16.0  86.1
2    11/20/2018 12:16  33.213907 -97.150953  ...        5.27   16.0  86.1
3    11/20/2018 12:16  33.213872 -97.150883  ...        5.03   16.0  86.1
...
364  11/20/2018 12:46  33.209462 -97.148623  ...        0.00    2.8   6.3
365  11/20/2018 12:46  33.209462 -97.148623  ...        0.00    2.8   6.3
366  11/20/2018 12:46  33.209462 -97.148623  ...        0.00    2.8   6.3]

df_weather:

     USAF  WBAN               dt  DIR SPD ... PCP01  PCP06  PCP24  PCPXX
0  722589  3991  11/20/2018 0:53  360   6 ...     0  *****  *****  *****
1  722589  3991  11/20/2018 1:53  350   6 ...     0  *****  *****  *****
2  722589  3991  11/20/2018 2:53  310   3 ...     0  *****  *****  *****
3  722589  3991  11/20/2018 3:53  330   5 ...     0  *****  *****  *****
4  722589  3991  11/20/2018 4:53  310   6 ...     0  *****  *****  *****

df_aq варьируется от 12: 16 до 12: 46, и df_weather каждый час имеет данные на отметке 53 минуты.Поэтому самые близкие времена были бы 11:53 и 12:53, поэтому я хотел бы, чтобы эти два раза и последующие данные о погоде соответствующим образом слились со всеми данными в df_aq

Я пытался поэкспериментировать с iloc и Index.get_loc, как это кажется лучшим способом, но я продолжаю получать сообщение об ошибке.

Я пробовал:

ctr = df_aq['dt'].count() - 1 
startTime = df_aq['dt'][0]
endTime = df_aq['dt'][ctr]
print df_weather.iloc[df_weather.index.get_loc(startTime,method='nearest') or df_weather.index.get_loc(endTime,method='nearest')]

, но затем я получаю сообщение об ошибке:

TypeError: unsupported operand type(s) for -: 'long' and 'str'

Я не уверен, что означает эта ошибка

Есть ли лучший способ сделать это, чем iloc?А если нет, что я делаю не так с этим битом кода?

Большое спасибо за любую помощь, которую вы можете предложить.

1 Ответ

0 голосов
/ 31 декабря 2018

Я позволю себе привести пример, который я использовал во время обучения :-), надеюсь, это поможет достичь того, что вы ищете.

Как указано в разделе комментариев, вы можете попробовать специальную функциюmerge_asof() для объединения временных рядов DataFrames

DataFrame First:

>>> df1
                     time ticker   price  quantity
0 2016-05-25 13:30:00.023   MSFT   51.95        75
1 2016-05-25 13:30:00.038   MSFT   51.95       155
2 2016-05-25 13:30:00.048   GOOG  720.77       100
3 2016-05-25 13:30:00.048   GOOG  720.92       100
4 2016-05-25 13:30:00.048   AAPL   98.00       100

DataFrame Second:

>>> df2
                     time ticker     bid     ask
0 2016-05-25 13:30:00.023   GOOG  720.50  720.93
1 2016-05-25 13:30:00.023   MSFT   51.95   51.96
2 2016-05-25 13:30:00.030   MSFT   51.97   51.98
3 2016-05-25 13:30:00.041   MSFT   51.99   52.00
4 2016-05-25 13:30:00.048   GOOG  720.50  720.93
5 2016-05-25 13:30:00.049   AAPL   97.99   98.01
6 2016-05-25 13:30:00.072   GOOG  720.50  720.88
7 2016-05-25 13:30:00.075   MSFT   52.01   52.03


>>> new_df = pd.merge_asof(df1, df2, on='time', by='ticker')

>>> new_df
                     time ticker   price  quantity     bid     ask
0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN

Проверка документации Doc merge_asof

...