前提・実現したいこと
geopandasでシェープを開いた時に属性の型を正しくしたい。
試したこと
python
1import geopandas as gpd 2 3gdf=gpd.read_file(r"C:\work\sample01\result\sample4.shp") 4 5#dtypeを見ると型が正しく設定されていないようです。 6for name,dtype in zip(gdf.columns.values,gdf.dtypes): 7 print("%s %s" % (name,dtype)) 8 9#astypeすると型が変換されるみたい 10gdf=gdf.astype({'test3': float, 'column': str,'D':'datetime64[ns]'}) 11for name,dtype in zip(gdf.columns.values,gdf.dtypes): 12 print("%s %s" % (name,dtype)) 13
開いた後だとastypeで型を変換できるようなのですが
これが普通のやり方なのでしょうか。
対象のファイルは、以下のコードで作ったものです。
python
1import osgeo.ogr as ogr 2import osgeo.osr as osr 3from shapely.geometry import LineString 4 5os.environ['SHAPE_ENCODING'] = "utf-8" 6 7# shapefileドライバ 8driver = ogr.GetDriverByName("ESRI Shapefile") 9 10# Shape出力先を設定 11data_source = driver.CreateDataSource(r"C:\work\sample01\result\sample4.shp") 12 13# レイヤ作成 14layer = data_source.CreateLayer("sample4", geom_type= ogr.wkbLineString) 15 16# フィールド追加 17field_name = ogr.FieldDefn("column", ogr.OFTString) 18field_name.SetWidth(24) 19layer.CreateField(field_name) 20 21field_add=ogr.FieldDefn("Latitude", ogr.OFTReal) 22field_add.SetWidth(4) 23field_add.SetPrecision(2) 24layer.CreateField(field_add) 25 26field_add=ogr.FieldDefn("Longitude", ogr.OFTReal) 27field_add.SetWidth(6) 28field_add.SetPrecision(2) 29layer.CreateField(field_add) 30 31field_add=ogr.FieldDefn("test3", ogr.OFTReal) 32field_add.SetWidth(8) 33field_add.SetPrecision(4) 34layer.CreateField(field_add) 35 36field_add=ogr.FieldDefn("D", ogr.OFTDate) 37field_add.SetWidth(20) 38layer.CreateField(field_add) 39 40 41feature = ogr.Feature(layer.GetLayerDefn()) 42feature.SetField("column", "test") 43feature.SetField("Latitude", 2) 44feature.SetField("Longitude", 5) 45feature.SetField("D", '2017/11/12') 46 47line = ogr.CreateGeometryFromWkt('LINESTRING (30 2.5, 30 5, 0 5)') 48feature.SetGeometry(line) 49layer.CreateFeature(feature) 50 51feature = ogr.Feature(layer.GetLayerDefn()) 52feature.SetField("column", "あい") 53feature.SetField("Latitude", 3) 54feature.SetField("Longitude", 6) 55feature.SetField("D", '2017/11/14') 56 57line = ogr.CreateGeometryFromWkt('LINESTRING (1 3, 4 5, 0 5)') 58feature.SetGeometry(line) 59layer.CreateFeature(feature) 60 61feature =None 62data_source = None
違っているとわかった個所は
Dのフィールドとtest3のフィールドで
作った時は日付型と実数型だったのですが
読み込んだら共にObject型になっていました。
補足情報(FW/ツールのバージョンなど)
Python 3.9.2
geopandas 0.8.2
回答1件
あなたの回答
tips
プレビュー