#python #json #pandas #dataframe
#python #json #pandas #фрейм данных
Вопрос:
По сути, у меня есть необработанные данные, которые были извлечены из определенного погодного API. С помощью SQL-запроса данные форматируются в фрейм данных со столбцами: широта (lats), долгота (lngs), дата и «большой двоичный объект».
Большой двоичный объект — это данные JSON, вложенные в 2 слоя. Данные, как вы увидите ниже, начинаются со сводки за весь день «ежедневно» на первом уровне и 24 почасовых сводки в разделе «ежечасно» на втором уровне.
lats lngs date blob
-46 168 2015-01-31 {"daily": {"apparentTemperatureMaxTime": 1422680400, "temperatureMax": 21.33, "temperatureMinTime": 1422615600, "temperatureMin": 16.06, "icon": "clear-day", "apparentTemperatureMax": 21.33, "summary": "Clear throughout the day.", "pressure": 1010.91, "temperatureMaxTime": 1422680400, "humidity": 0.81, "dewPoint": 15.14, "sunsetTime": 1422692673, "precipType": "rain", "windSpeed": 3.01, "apparentTemperatureMin": 16.06, "sunriseTime": 1422639631, "apparentTemperatureMinTime": 1422615600, "time": 1422615600, "visibility": 16.09, "windBearing": 75, "moonPhase": 0.38}, "hourly": [{"apparentTemperature": 16.06, "windSpeed": 4.29, "icon": "clear-night", "temperature": 16.06, "summary": "Clear", "pressure": 1015.05, "humidity": 0.89, "dewPoint": 14.23, "precipType": "rain", "time": 1422615600, "visibility": 16.09, "windBearing": 97}, {"apparentTemperature": 16.17, "windSpeed": 4.22, "icon": "clear-night", "temperature": 16.17, "summary": "Clear", "pressure": 1014.91, "humidity": 0.88, "dewPoint": 14.19, "precipType": "rain", "time": 1422619200, "visibility": 16.09, "windBearing": 94}, {"apparentTemperature": 16.27, "windSpeed": 4.09, "icon": "clear-night", "temperature": 16.27, "summary": "Clear", "pressure": 1014.51, "humidity": 0.87, "dewPoint": 14.14, "precipType": "rain", "time": 1422622800, "visibility": 16.09, "windBearing": 87}, {"apparentTemperature": 16.36, "windSpeed": 4, "icon": "clear-night", "temperature": 16.36, "summary": "Clear", "pressure": 1013.94, "humidity": 0.86, "dewPoint": 14.09, "precipType": "rain", "time": 1422626400, "visibility": 16.09, "windBearing": 80}, {"apparentTemperature": 16.4, "windSpeed": 3.9, "icon": "clear-night", "temperature": 16.4, "summary": "Clear", "pressure": 1013.43, "humidity": 0.86, "dewPoint": 14.07, "precipType": "rain", "time": 1422630000, "visibility": 16.09, "windBearing": 75},
Ниже приведен список из 2 наборов данных для 1 даты.
{'lat': {0: -45, 1: -45}, 'lng': {0: 169, 1: 170}, 'date': {0: datetime.date(2015, 1, 1), 1: datetime.date(2015, 1, 1)}, 'blob': {0: {'daily': {'apparentTemperatureMaxTime': 1420088400, 'temperatureMax': 19.06, 'temperatureMinTime': 1420045200, 'temperatureMin': 7.86, 'icon': 'clear-day', 'apparentTemperatureMax': 19.06, 'summary': 'Clear throughout the day.', 'pressure': 1013.08, 'temperatureMaxTime': 1420088400, 'humidity': 0.61, 'dewPoint': 5.49, 'sunsetTime': 1420101288, 'precipType': 'rain', 'windSpeed': 3.18, 'apparentTemperatureMin': 6.76, 'sunriseTime': 1420045310, 'apparentTemperatureMinTime': 1420041600, 'time': 1420023600, 'visibility': 16, 'windBearing': 241, 'moonPhase': 0.36}, 'hourly': [{'apparentTemperature': 6.78, 'windSpeed': 6.98, 'icon': 'clear-night', 'temperature': 9.88, 'summary': 'Clear', 'pressure': 1005.77, 'humidity': 0.81, 'dewPoint': 6.74, 'precipType': 'rain', 'time': 1420023600, 'visibility': 12.59, 'windBearing': 208}, {'apparentTemperature': 7.23, 'windSpeed': 4.95, 'icon': 'clear-night', 'temperature': 9.7, 'summary': 'Clear', 'pressure': 1007.34, 'humidity': 0.81, 'dewPoint': 6.51, 'precipType': 'rain', 'time': 1420027200, 'visibility': 16.09, 'windBearing': 217}, {'apparentTemperature': 7.19, 'windSpeed': 4.13, 'icon': 'clear-night', 'temperature': 9.39, 'summary': 'Clear', 'pressure': 1008.35, 'humidity': 0.81, 'dewPoint': 6.29, 'precipType': 'rain', 'time': 1420030800, 'visibility': 16.09, 'windBearing': 226}, {'apparentTemperature': 6.96, 'windSpeed': 3.77, 'icon': 'clear-night', 'temperature': 9.06, 'summary': 'Clear', 'pressure': 1009.02, 'humidity': 0.82, 'dewPoint': 6.09, 'precipType': 'rain', 'time': 1420034400, 'visibility': 16.09, 'windBearing': 235}, {'apparentTemperature': 6.79, 'windSpeed': 3.38, 'icon': 'clear-night', 'temperature': 8.76, 'summary': 'Clear', 'pressure': 1009.81, 'humidity': 0.82, 'dewPoint': 5.83, 'precipType': 'rain', 'time': 1420038000, 'visibility': 16.09, 'windBearing': 243}, {'apparentTemperature': 6.76, 'windSpeed': 2.56, 'icon': 'clear-night', 'temperature': 8.29, 'summary': 'Clear', 'pressure': 1010.94, 'humidity': 0.82, 'dewPoint': 5.33, 'precipType': 'rain', 'time': 1420041600, 'visibility': 16.09, 'windBearing': 249}, {'apparentTemperature': 7.09, 'windSpeed': 1.6, 'icon': 'clear-night', 'temperature': 7.86, 'summary': 'Clear', 'pressure': 1012.19, 'humidity': 0.81, 'dewPoint': 4.76, 'precipType': 'rain', 'time': 1420045200, 'visibility': 16.09, 'windBearing': 255}, {'apparentTemperature': 8.08, 'windSpeed': 1.15, 'icon': 'clear-day', 'temperature': 8.08, 'summary': 'Clear', 'pressure': 1013.28, 'humidity': 0.78, 'dewPoint': 4.47, 'precipType': 'rain', 'time': 1420048800, 'visibility': 16.09, 'windBearing': 265}, {'apparentTemperature': 8.95, 'windSpeed': 1.62, 'icon': 'clear-day', 'temperature': 9.49, 'summary': 'Clear', 'pressure': 1014.17, 'humidity': 0.71, 'dewPoint': 4.59, 'precipType': 'rain', 'time': 1420052400, 'visibility': 16.09, 'windBearing': 265}, {'apparentTemperature': 11.57, 'windSpeed': 2.55, 'icon': 'clear-day', 'temperature': 11.57, 'summary': 'Clear', 'pressure': 1014.91, 'humidity': 0.63, 'dewPoint': 4.76, 'precipType': 'rain', 'time': 1420056000, 'visibility': 16.09, 'windBearing': 261}, {'apparentTemperature': 13.41, 'windSpeed': 3.3, 'icon': 'clear-day', 'temperature': 13.41, 'summary': 'Clear', 'pressure': 1015.39, 'humidity': 0.56, 'dewPoint': 4.79, 'precipType': 'rain', 'time': 1420059600, 'visibility': 16.09, 'windBearing': 260}, {'apparentTemperature': 14.68, 'windSpeed': 3.65, 'icon': 'clear-day', 'temperature': 14.68, 'summary': 'Clear', 'pressure': 1015.52, 'humidity': 0.52, 'dewPoint': 4.83, 'precipType': 'rain', 'time': 1420063200, 'visibility': 16.09, 'windBearing': 260}, {'apparentTemperature': 15.71, 'windSpeed': 3.81, 'icon': 'clear-day', 'temperature': 15.71, 'summary': 'Clear', 'pressure': 1015.39, 'humidity': 0.49, 'dewPoint': 4.96, 'precipType': 'rain', 'time': 1420066800, 'visibility': 16.09, 'windBearing': 261}, {'apparentTemperature': 16.59, 'windSpeed': 3.77, 'icon': 'clear-day', 'temperature': 16.59, 'summary': 'Clear', 'pressure': 1015.18, 'humidity': 0.47, 'dewPoint': 5.17, 'precipType': 'rain', 'time': 1420070400, 'visibility': 16.09, 'windBearing': 260}, {'apparentTemperature': 17.33, 'windSpeed': 3.4, 'icon': 'clear-day', 'temperature': 17.33, 'summary': 'Clear', 'pressure': 1014.95, 'humidity': 0.46, 'dewPoint': 5.55, 'precipType': 'rain', 'time': 1420074000, 'visibility': 16.09, 'windBearing': 253}, {'apparentTemperature': 17.92, 'windSpeed': 2.94, 'icon': 'clear-day', 'temperature': 17.92, 'summary': 'Clear', 'pressure': 1014.64, 'humidity': 0.46, 'dewPoint': 6.06, 'precipType': 'rain', 'time': 1420077600, 'visibility': 16.09, 'windBearing': 240}, {'apparentTemperature': 18.36, 'windSpeed': 2.81, 'icon': 'clear-day', 'temperature': 18.36, 'summary': 'Clear', 'pressure': 1014.31, 'humidity': 0.46, 'dewPoint': 6.39, 'precipType': 'rain', 'time': 1420081200, 'visibility': 16.09, 'windBearing': 229}, {'apparentTemperature': 18.78, 'windSpeed': 3.08, 'icon': 'clear-day', 'temperature': 18.78, 'summary': 'Clear', 'pressure': 1013.85, 'humidity': 0.44, 'dewPoint': 6.43, 'precipType': 'rain', 'time': 1420084800, 'visibility': 16.09, 'windBearing': 227}, {'apparentTemperature': 19.06, 'windSpeed': 3.5, 'icon': 'clear-day', 'temperature': 19.06, 'summary': 'Clear', 'pressure': 1013.37, 'humidity': 0.43, 'dewPoint': 6.29, 'precipType': 'rain', 'time': 1420088400, 'visibility': 16.09, 'windBearing': 230}, {'apparentTemperature': 18.78, 'windSpeed': 3.76, 'icon': 'clear-day', 'temperature': 18.78, 'summary': 'Clear', 'pressure': 1013.31, 'humidity': 0.43, 'dewPoint': 6.06, 'precipType': 'rain', 'time': 1420092000, 'visibility': 16.09, 'windBearing': 233}, {'apparentTemperature': 17.53, 'windSpeed': 3.78, 'icon': 'clear-day', 'temperature': 17.53, 'summary': 'Clear', 'pressure': 1014.01, 'humidity': 0.45, 'dewPoint': 5.54, 'precipType': 'rain', 'time': 1420095600, 'visibility': 16.09, 'windBearing': 238}, {'apparentTemperature': 15.72, 'windSpeed': 3.68, 'icon': 'clear-day', 'temperature': 15.72, 'summary': 'Clear', 'pressure': 1015.13, 'humidity': 0.48, 'dewPoint': 4.85, 'precipType': 'rain', 'time': 1420099200, 'visibility': 16.09, 'windBearing': 244}, {'apparentTemperature': 14.18, 'windSpeed': 3.29, 'icon': 'clear-night', 'temperature': 14.18, 'summary': 'Clear', 'pressure': 1016.13, 'humidity': 0.52, 'dewPoint': 4.51, 'precipType': 'rain', 'time': 1420102800, 'visibility': 16.09, 'windBearing': 250}, {'apparentTemperature': 13.23, 'windSpeed': 2.39, 'icon': 'clear-night', 'temperature': 13.23, 'summary': 'Clear', 'pressure': 1016.88, 'humidity': 0.57, 'dewPoint': 4.88, 'precipType': 'rain', 'time': 1420106400, 'visibility': 16.09, 'windBearing': 255}]}, 1: {'daily': {'apparentTemperatureMaxTime': 1420081200, 'temperatureMax': 18.18, 'temperatureMinTime': 1420045200, 'temperatureMin': 8.68, 'icon': 'clear-day', 'apparentTemperatureMax': 18.18, 'summary': 'Clear throughout the day.', 'pressure': 1013.16, 'temperatureMaxTime': 1420081200, 'humidity': 0.63, 'dewPoint': 6.58, 'sunsetTime': 1420101048, 'precipType': 'rain', 'windSpeed': 1.6, 'apparentTemperatureMin': 7.85, 'sunriseTime': 1420045069, 'apparentTemperatureMinTime': 1420041600, 'time': 1420023600, 'visibility': 16.06, 'windBearing': 232, 'moonPhase': 0.36}, 'hourly': [{'apparentTemperature': 11.77, 'windSpeed': 6.44, 'icon': 'clear-night', 'temperature': 11.77, 'summary': 'Clear', 'pressure': 1004.34, 'humidity': 0.77, 'dewPoint': 7.78, 'precipType': 'rain', 'time': 1420023600, 'visibility': 14.73, 'windBearing': 222}, {'apparentTemperature': 11.13, 'windSpeed': 5.33, 'icon': 'clear-night', 'temperature': 11.13, 'summary': 'Clear', 'pressure': 1006.11, 'humidity': 0.78, 'dewPoint': 7.52, 'precipType': 'rain', 'time': 1420027200, 'visibility': 16.09, 'windBearing': 218}, {'apparentTemperature': 10.48, 'windSpeed': 4.48, 'icon': 'clear-night', 'temperature': 10.48, 'summary': 'Clear', 'pressure': 1007.3, 'humidity': 0.79, 'dewPoint': 6.95, 'precipType': 'rain', 'time': 1420030800, 'visibility': 16.09, 'windBearing': 218}, {'apparentTemperature': 8.01, 'windSpeed': 3.65, 'icon': 'clear-night', 'temperature': 9.87, 'summary': 'Clear', 'pressure': 1008.18, 'humidity': 0.78, 'dewPoint': 6.27, 'precipType': 'rain', 'time': 1420034400, 'visibility': 16.09, 'windBearing': 222}, {'apparentTemperature': 7.87, 'windSpeed': 2.9, 'icon': 'clear-night', 'temperature': 9.42, 'summary': 'Clear', 'pressure': 1009.12, 'humidity': 0.78, 'dewPoint': 5.77, 'precipType': 'rain', 'time': 1420038000, 'visibility': 16.09, 'windBearing': 228}, {'apparentTemperature': 7.85, 'windSpeed': 2.18, 'icon': 'clear-night', 'temperature': 8.98, 'summary': 'Clear', 'pressure': 1010.33, 'humidity': 0.79, 'dewPoint': 5.55, 'precipType': 'rain', 'time': 1420041600, 'visibility': 16.09, 'windBearing': 235}, {'apparentTemperature': 8.07, 'windSpeed': 1.56, 'icon': 'clear-night', 'temperature': 8.68, 'summary': 'Clear', 'pressure': 1011.62, 'humidity': 0.8, 'dewPoint': 5.5, 'precipType': 'rain', 'time': 1420045200, 'visibility': 16.09, 'windBearing': 247}, {'apparentTemperature': 9.08, 'windSpeed': 1.31, 'icon': 'clear-day', 'temperature': 9.08, 'summary': 'Clear', 'pressure': 1012.76, 'humidity': 0.79, 'dewPoint': 5.6, 'precipType': 'rain', 'time': 1420048800, 'visibility': 16.09, 'windBearing': 265}, {'apparentTemperature': 10.71, 'windSpeed': 1.57, 'icon': 'clear-day', 'temperature': 10.71, 'summary': 'Clear', 'pressure': 1013.74, 'humidity': 0.72, 'dewPoint': 5.8, 'precipType': 'rain', 'time': 1420052400, 'visibility': 16.09, 'windBearing': 277}, {'apparentTemperature': 13.04, 'windSpeed': 2.04, 'icon': 'clear-day', 'temperature': 13.04, 'summary': 'Clear', 'pressure': 1014.59, 'humidity': 0.62, 'dewPoint': 5.82, 'precipType': 'rain', 'time': 1420056000, 'visibility': 16.09, 'windBearing': 280}, {'apparentTemperature': 15, 'windSpeed': 2.33, 'icon': 'clear-day', 'temperature': 15, 'summary': 'Clear', 'pressure': 1015.2, 'humidity': 0.53, 'dewPoint': 5.62, 'precipType': 'rain', 'time': 1420059600, 'visibility': 16.09, 'windBearing': 280}, {'apparentTemperature': 16.19, 'windSpeed': 2.35, 'icon': 'clear-day', 'temperature': 16.19, 'summary': 'Clear', 'pressure': 1015.48, 'humidity': 0.49, 'dewPoint': 5.54, 'precipType': 'rain', 'time': 1420063200, 'visibility': 16.09, 'windBearing': 277}, {'apparentTemperature': 17.03, 'windSpeed': 2.2, 'icon': 'clear-day', 'temperature': 17.03, 'summary': 'Clear', 'pressure': 1015.53, 'humidity': 0.47, 'dewPoint': 5.64, 'precipType': 'rain', 'time': 1420066800, 'visibility': 16.09, 'windBearing': 271}, {'apparentTemperature': 17.63, 'windSpeed': 1.76, 'icon': 'clear-day', 'temperature': 17.63, 'summary': 'Clear', 'pressure': 1015.51, 'humidity': 0.46, 'dewPoint': 5.91, 'precipType': 'rain', 'time': 1420070400, 'visibility': 16.09, 'windBearing': 263}, {'apparentTemperature': 18.01, 'windSpeed': 0.8, 'icon': 'clear-day', 'temperature': 18.01, 'summary': 'Clear', 'pressure': 1015.5, 'humidity': 0.47, 'dewPoint': 6.51, 'precipType': 'rain', 'time': 1420074000, 'visibility': 16.09, 'windBearing': 236}, {'apparentTemperature': 18.17, 'windSpeed': 1.01, 'icon': 'clear-day', 'temperature': 18.17, 'summary': 'Clear', 'pressure': 1015.42, 'humidity': 0.49, 'dewPoint': 7.28, 'precipType': 'rain', 'time': 1420077600, 'visibility': 16.09, 'windBearing': 134}, {'apparentTemperature': 18.18, 'windSpeed': 1.86, 'icon': 'clear-day', 'temperature': 18.18, 'summary': 'Clear', 'pressure': 1015.32, 'humidity': 0.51, 'dewPoint': 7.79, 'precipType': 'rain', 'time': 1420081200, 'visibility': 16.09, 'windBearing': 118}, {'apparentTemperature': 18.16, 'windSpeed': 1.94, 'icon': 'clear-day', 'temperature': 18.16, 'summary': 'Clear', 'pressure': 1015.08, 'humidity': 0.51, 'dewPoint': 7.83, 'precipType': 'rain', 'time': 1420084800, 'visibility': 16.09, 'windBearing': 118}, {'apparentTemperature': 17.98, 'windSpeed': 1.56, 'icon': 'clear-day', 'temperature': 17.98, 'summary': 'Clear', 'pressure': 1014.82, 'humidity': 0.51, 'dewPoint': 7.63, 'precipType': 'rain', 'time': 1420088400, 'visibility': 16.09, 'windBearing': 123}, {'apparentTemperature': 17.43, 'windSpeed': 1.06, 'icon': 'clear-day', 'temperature': 17.43, 'summary': 'Clear', 'pressure': 1014.82, 'humidity': 0.52, 'dewPoint': 7.46, 'precipType': 'rain', 'time': 1420092000, 'visibility': 16.09, 'windBearing': 136}, {'apparentTemperature': 16.22, 'windSpeed': 0.63, 'icon': 'clear-day', 'temperature': 16.22, 'summary': 'Clear', 'pressure': 1015.3, 'humidity': 0.56, 'dewPoint': 7.32, 'precipType': 'rain', 'time': 1420095600, 'visibility': 16.09, 'windBearing': 191}, {'apparentTemperature': 14.62, 'windSpeed': 1.22, 'icon': 'clear-day', 'temperature': 14.62, 'summary': 'Clear', 'pressure': 1016.05, 'humidity': 0.61, 'dewPoint': 7.07, 'precipType': 'rain', 'time': 1420099200, 'visibility': 16.09, 'windBearing': 249}, {'apparentTemperature': 13.17, 'windSpeed': 1.68, 'icon': 'clear-night', 'temperature': 13.17, 'summary': 'Clear', 'pressure': 1016.68, 'humidity': 0.66, 'dewPoint': 6.86, 'precipType': 'rain', 'time': 1420102800, 'visibility': 16.09, 'windBearing': 262}, {'apparentTemperature': 11.98, 'windSpeed': 1.21, 'icon': 'clear-night', 'temperature': 11.98, 'summary': 'Clear', 'pressure': 1017.11, 'humidity': 0.71, 'dewPoint': 6.86, 'precipType': 'rain', 'time': 1420106400, 'visibility': 16.09, 'windBearing': 271}]}}}
Прямо сейчас, чтобы я мог в конечном итоге превратить его в функцию, я делал это шаг за шагом, надеясь выполнить все шаги, но я застрял с некоторыми преобразованиями вложенных данных в формате JSON / DICT.
Цель состоит в том, чтобы разбить большой двоичный объект так, чтобы 24 часа были извлечены и разделены, сохраняя их в паре с исходными lats, lgn и date.
Из упомянутого SQL-запроса я уже получаю данные в фрейме данных с 4 столбцами, показанном выше. Я могу изолировать «большой двоичный объект», используя:
test_df = temps_df.iloc[:,3]
и получить вывод:
id blob
0 {'daily': {'apparentTemperatureMaxTime': 14215...
Затем я попытался нормализовать это с помощью:
test_df = pd.DataFrame.from_dict(json_normalize(test_df))
И он разбивает его на один слой в фрейм данных со всеми ежедневными условиями (мусор), а затем все 24 почасовых условия в другом bob (здесь нет аккуратного способа поместить эту таблицу из 22 столбцов.
Пытаясь продвинуться еще на одну глубину, я попытался:
hourly_df = json_normalize(data=test_df, record_path = 'hourly')
Но это дает мне:
TypeError: string indices must be integers
temps_df = db.get_historical_weather(lats, lngs, start_date, end_date)
temps_df.head()
lat lng date blob
0 -45 170 2015-01-18 {'daily': {'apparentTemperatureMaxTime': 14215...
1 -45 170 2015-01-19 {'daily': {'apparentTemperatureMaxTime': 14216...
2 -45 170 2015-01-20 {'daily': {'apparentTemperatureMaxTime': 14217...
3 -45 170 2015-01-21 {'daily': {'apparentTemperatureMaxTime': 14218...
4 -45 170 2015-01-22 {'daily': {'apparentTemperatureMaxTime': 14219...
test_df = temps_df.iloc[:,3]
test_df.head()
0 {'daily': {'apparentTemperatureMaxTime': 14215...
1 {'daily': {'apparentTemperatureMaxTime': 14216...
2 {'daily': {'apparentTemperatureMaxTime': 14217...
3 {'daily': {'apparentTemperatureMaxTime': 14218...
4 {'daily': {'apparentTemperatureMaxTime': 14219...
Name: blob, dtype: object
test_df = pd.DataFrame.from_dict(json_normalize(test_df))
test_df.head()
daily.apparentTemperatureMax daily.apparentTemperatureMaxTime daily.apparentTemperatureMin daily.apparentTemperatureMinTime daily.dewPoint daily.humidity daily.icon daily.moonPhase daily.precipType daily.pressure ... daily.sunsetTime daily.temperatureMax daily.temperatureMaxTime daily.temperatureMin daily.temperatureMinTime daily.time daily.visibility daily.windBearing daily.windSpeed hourly
0 21.17 1421542800 12.39 1421514000 10.78 0.74 clear-day 0.90 rain 995.62 ... 1421569528 21.17 1421542800 12.39 1421514000 1421492400 14.27 232 1.13 [{'apparentTemperature': 14.21, 'windSpeed': 0...
1 15.69 1421632800 9.66 1421600400 9.34 0.79 clear-day 0.94 rain 1000.24 ... 1421655887 15.69 1421632800 9.66 1421600400 1421578800 13.74 223 0.53 [{'apparentTemperature': 11.41, 'windSpeed': 1...
2 16.73 1421719200 8.53 1421686800 7.86 0.74 clear-day 0.97 rain 1014.10 ... 1421742244 16.73 1421719200 8.53 1421686800 1421665200 15.85 208 1.94 [{'apparentTemperature': 10.08, 'windSpeed': 1...
hourly_df = json_normalize(data=test_df, record_path = 'hourly')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-15-dd6793be4e4c> in <module>()
----> 1 hourly_df = json_normalize(data=test_df, record_path = 'hourly')
/opt/conda/lib/python3.6/site-packages/pandas/io/json/normalize.py in json_normalize(data, record_path, meta, meta_prefix, record_prefix, errors, sep)
260 records.extend(recs)
261
--> 262 _recursive_extract(data, record_path, {}, level=0)
263
264 result = DataFrame(records)
/opt/conda/lib/python3.6/site-packages/pandas/io/json/normalize.py in _recursive_extract(data, path, seen_meta, level)
236 else:
237 for obj in data:
--> 238 recs = _pull_field(obj, path[0])
239
240 # For repeating the metadata later
/opt/conda/lib/python3.6/site-packages/pandas/io/json/normalize.py in _pull_field(js, spec)
183 result = result[field]
184 else:
--> 185 result = result[spec]
186
187 return result
TypeError: string indices must be integers
Опять же, я пробую это построчно, надеясь получить одну грандиозную функцию, которая выдает результат, который я ищу. В конце концов, я бы искал фрейм данных, который просто есть…
lat lng date hour temp
0 -45 170 2015-01-28 0 10
1 -45 170 2015-01-28 1 10
2 -45 170 2015-01-28 2 10
3 -45 170 2015-01-28 3 10
4 -45 170 2015-01-28 4 10
Таким образом, он будет отображать все 24 часа данных для одной даты с одним широтным и lng, затем переходить к следующей дате для этого широтного и lng, пока не пройдут все даты во фрейме, затем он увеличится до пары lat lng.
Комментарии:
1. Не могли бы вы опубликовать вывод следующего:
print(test_df.head().to_dict())
? Это позволяет пользователям легко воссоздавать ваш фрейм данных, и людям будет проще помогать вам!2. На каком этапе вы хотели бы увидеть этот Бен?
3. Мне просто нужен способ получить часть вашего фрейма данных в форме, в которой я могу легко создать свой собственный. Его сложно протестировать иначе.
4. Бен, в идеале, сколько lats / lng вы хотели бы видеть? Если я дам вам заголовок из 5 записей, я превысил лимит символов для сообщения.
5. Добавлен dict одной строки.
Ответ №1:
import json
from pandas.io.json import json_normalize
#from your data
df = pd.DataFrame(data)
#make the entire df a json file
df_json = df.to_json(orient = 'records', date_format='iso')
#use json_normalize to read in your json file, look at the hourly dict, and attach lat, lng and date.
df2 = json_normalize(json.loads(df_json), record_path = ['blob' , 'hourly'] , meta = ['lat', 'lng', 'date'])
#look at only the columns you want
df3 = df2.reindex(['lat', 'lng', 'date','temperature'], axis = 1)
#repeat 0-23 for the lenght of the df (since the time column in hourly isnt quite right, look at your dict that you posted)
df3['hour'] = (np.arange(0, 24).tolist())*(int(len(df3)/24))
df3.head()
lat lng date temperature hour
0 -44 169 2015-09-28T00:00:00.000Z 8.62 0
1 -44 169 2015-09-28T00:00:00.000Z 8.34 1
2 -44 169 2015-09-28T00:00:00.000Z 7.30 2
3 -44 169 2015-09-28T00:00:00.000Z 5.94 3
4 -44 169 2015-09-28T00:00:00.000Z 4.88 4
Самый простой способ сделать это — экспортировать данные в json, а затем прочитать их с помощью json_normalize . Столбец времени в dict не совсем правильный, поэтому я создал свой собственный столбец часов (но если все они являются полными днями, то это будет работать нормально).
#Output with two rows:
df3.iloc[np.r_[0:5, -5:0]]
lat lng date temperature hour
0 -45 169 2015-01-01T00:00:00.000Z 9.88 0
1 -45 169 2015-01-01T00:00:00.000Z 9.70 1
2 -45 169 2015-01-01T00:00:00.000Z 9.39 2
3 -45 169 2015-01-01T00:00:00.000Z 9.06 3
4 -45 169 2015-01-01T00:00:00.000Z 8.76 4
43 -45 170 2015-01-01T00:00:00.000Z 17.43 19
44 -45 170 2015-01-01T00:00:00.000Z 16.22 20
45 -45 170 2015-01-01T00:00:00.000Z 14.62 21
46 -45 170 2015-01-01T00:00:00.000Z 13.17 22
47 -45 170 2015-01-01T00:00:00.000Z 11.98 23
Комментарии:
1. Ошибка в реализации…
temps_json = temps_df.to_json(orient = 'records', date_format='iso') temps_hourly_df = json_normalize(json.loads(temps_json), record_path = ['blob', 'hourly'], meta = ['lat', 'lng', 'date']) --------------------------------------------------------------------------- TypeError: string indices must be integers
2. Похоже, что с вашим temps_df произошла ошибка. Когда я запускаю ваш код, но заменяю temps_df на мой df, он работает нормально. Попробуйте импортировать свои собственные данные в новый df с вашим собственным dict, как я, и посмотрите, что произойдет.
3. Я сделал, как вы предложили, преобразовав свои данные в dict, а затем обратно в фрейм данных, но произошло то же самое. Может быть, это потому, что у меня несколько lats и lng, в то время как то, что я предоставил, имеет только один?
4. Почему бы вам не отредактировать свой dict, который вы оставили мне для 2 строк с разными широтами / длинами, и я могу посмотреть, работает ли это с моей стороны, в то же время запустите мой код только с тем dict, который вы опубликовали, и посмотрите, работает ли это. Также вы получили ту же ошибку, когда вы это сделали?
5. Добавлено 2 строки данных в виде dict. Что я сделал, так это взял фрейм данных, который у меня был (temps_df), преобразовал его в dict, чтобы он эмулировал то, что я вам дал. Я запустил ваши строки, как показано выше, и получил ту же ошибку. Я попробую еще раз, чтобы посмотреть, не напутал ли я что-то.