python

import urllib.request as conn
import pandas as pd

#url csv
url_csv = 'http://www2.tmd.go.th/wrf_tmd/images/BKK_WRFDA1/BKK_12/CSV/bn.csv' บางนา
#url_csv = 'http://www2.tmd.go.th/wrf_tmd/images/BKK_WRFDA1/BKK_12/CSV/sn.csv' สนามบินสุวรรณฯ
#url_csv = 'http://www2.tmd.go.th/wrf_tmd/images/BKK_WRFDA1/BKK_12/CSV/don.csv' ดอนเมือง
#url_csv = 'http://www2.tmd.go.th/wrf_tmd/images/BKK_WRFDA1/BKK_12/CSV/sk.csv' หอประชุมแห่งชาติ
#url_csv = 'http://www2.tmd.go.th/wrf_tmd/images/BKK_WRFDA1/BKK_12/CSV/ptn.csv' ปทุมธานี

with conn.urlopen(url_csv) as dummy:
buffer = dummy.read()
buffer = buffer.decode('utf-8')
olst = buffer.split('\n')
olst[8:]

data = [[h for h in i.split(' ') if h !=''] for i in olst[8:]]
df = pd.DataFrame(data, columns=['Forecast', 'Time', 'Temp[°C]', 'MSLP[hPa]', 'RH[%]', 'Rain rate[mm.]'])
print(df.shape)
print(df.Forecast)

คำถามที่ 1. จากโค๊ดผมอยากรวมข้อมูล .csv จาก link url (ไม่อ่านจากไฟล์ในเครื่อง) หลายลิงค์มารวมกัน ผมลองศึกษาตามเว็บหรือยูทูปแล้ว ผมไม่สามารถรวมตามตัวอย่างที่ผู้สอนแสดงได้ เนื่องจากตัว .csv ของผมมันเป็นข้อมูล 1 ก้อน ที่ยังไม่ได้เอาข้อมูลออกมา แต่ตามตัวอย่างเขาแยกออกมาเป็นตารางแล้ว ผมลองทำตามทุกขั้นตอนปรากฏไม่ได้ครับ จะติดปัญหาตรงส่วน
df = pd.reader_csv('http://www2.tmd.go.th/wrf_tmd/images/BKK_WRFDA1/BKK_12/CSV/bn.csv')
**มันจะขึ้น eror tokenzing data. C error:Expected 1 fields in line 4, saw 2

คำถามที่ 2. import requests
import folium
import json
import branca
import urllib.request as conn
import pandas as pd

### api
r = requests.get('http://data.tmd.go.th/api/Weather3Hours/V1/')
doc = eval(r.text)
a = doc['Stations']
DateTime = doc['Header']['LastBuiltDate']
i = 0

### data Temp
imap = folium.Map(location=[15.0000, 100.0000], zoom_start=7)
for i in a:
data = """
ตำแหน่ง :{}
อุณหภูมิ : {} องศาเซลซียส
จุดน้ำค้าง : {} องศาเซลซียส
ความชื้นสัมพัทธ์ : {} เปอร์เซ็นต์
ปริมาณฝน : {} มิลลิเมตร
ความเร็วลม : {} กิโลเมตร/ชั่วโมง
ทิศทางลม : {} องศา
ความกดอากาศ : {} มิลลิบาร์
ทัศนวิสัย : {} กิโลเมตร

**ถ้าผมอยากเอาข้อมูลในส่วนของคำถามที่ 1 คือ Forecast, Time, Temp[°C], MSLP[hPa], RH[%], Rain rate[mm.] มาแสดงต่อท้ายตรงนี้ โดยมีเงื่อนไขว่า จะแสดงเฉพาะเขตตาม ข้อมูล csv เช่น ดอนเมืองก็จะแสดงเฉพาะส่วนของดอนเมือง พร้อมทั้งแสดงกราฟข้อมูลทั้งหมด เขียนโค๊ดยังไงครับ

""".format(i['Province'], i['Observe']['Temperature']['Value'],
i['Observe']['DewPoint']['Value'],
i['Observe']['RelativeHumidity']['Value'],
i['Observe']['Rainfall']['Value'],
i['Observe']['WindSpeed']['Value'],
i['Observe']['WindDirection']['Value'],
i['Observe']['MeanSeaLevelPressure']['Value'],
i['Observe']['LandVisibility']['Value'],)

data
iframe = branca.element.IFrame(html=data, width=500, height=300)
popup = folium.Popup(iframe, max_width=500)

folium.Marker(
[float(i['Latitude']['Value']), float(i['Longitude']['Value'])],
popup = popup
).add_to(imap)

imap.save('WeatherMap_01.html')
imap
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
1. ข้อมูลที่คุณจะอ่านจากเว็บนั้นมันไม่ใช่ csv น่ะครับ คุณต้องเขียนสคริปต์ clean ข้อมูลเอง จะใช้ read_csv() ช่วยก็ได้ระดับหนึ่งแต่ก็เหนื่อยหน่อยนะครับ ผมช่วยเริ่มให้ละกัน


2. เนื่องจากคุณอ่านข้อมูลมาแยกไฟล์(บนเว็บ)อยู่แล้ว จะแยกเป็นหลาย df ก็ได้ หรือถ้ารวมกันก็สร้างคอลัมน์ใหม่ที่ระบุชื่อสถานีไว้เท่านั้นเอง
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่