我有来自3个不同卫星的20多个农业领域的卫星图像。每个图像名称都包含数据收集数据和其中的卫星名称。文件名的前两位数字是月份,后两位数字是日期,最后一部分包含卫星名称。假设此代码将使用六个图像。
每个图像都经过一个循环,在循环中将它们处理为numpy数组。代码是-
image_list = ["D:/6.10.SkySat.tif", "D:/06.30.SkySat.tif", "D:/06.06.RapidEye.tif",
"D:/06.16.RapidEye.tif", "D:/06.26.PlanetScope.tif", "D:/06.30.PlanetScope.tif"]
for image in image_list:
#converting raster image to numpy array
array = arcpy.RasterToNumPyArray(image, nodata_to_value=9999)
#masking out the no data value and converting into one dimentional array
marray = numpy.ma.masked_values(array,9999)
new_array = marray.flatten()
#extracting the date and satellite name
date = image[3:8]
satellite = image[9:-4]
在这里,我得到一个一维数组,一个日期和一个字符串(卫星名称)。为了进一步使用,我希望它们采用以下所示的格式。数据将具有三列。一个将具有数组中的所有像素值,下一个将包含日期,最后一个将具有Satellite名称。
Value Date Satellite
0.05825 6/15/2018 SkySat
0.07967976 6/15/2018 SkySat
0.09638854 6/15/2018 SkySat
0.12477265 6/15/2018 SkySat
0.13941683 6/15/2018 SkySat
0.13072205 6/15/2018 SkySat
0.12254229 6/15/2018 SkySat
0.13378483 6/15/2018 SkySat
0.13875392 6/15/2018 SkySat
0.14010076 6/10/2018 PlanetScope
0.1371166 6/10/2018 PlanetScope
0.13878246 6/10/2018 PlanetScope
0.1351179 6/10/2018 PlanetScope
0.16816537 6/10/2018 PlanetScope
0.16348109 6/10/2018 PlanetScope
0.15997969 6/10/2018 PlanetScope
0.16568226 6/10/2018 PlanetScope
0.190534599 6/12/2018 RapidEye
0.219114789 6/12/2018 RapidEye
0.251982007 6/12/2018 RapidEye
0.289779308 6/12/2018 RapidEye
0.333246204 6/12/2018 RapidEye
有什么办法可以以这种格式排列数据,然后将其写入CSV或文本文件?
答案 0 :(得分:1)
欢迎使用Stackoverflow Saurav!
我看到您的问题的方式是,您只想为相应的“值”的一维数组重复“日期”和“卫星名称”的值。
考虑以下示例:
value1 = [1,2,3]
date1 = '1 sep'
satellite_name1 = 'sauravyan'
您可以使用numpy的“重复”功能:
date1 = np.repeat(date1,len(value1))
satellite_name1 = np.repeat(satellite_name1, len(value_1))
使日期数组重复任意次数。您的情况下的值数组长度。
最终将所有内容转换为csv,我认为最好的方法是
(i)将所有内容推送至字典:
d['values'].extend(value_1)
d['dates'].extend(date_1)
d['satellites'].extend(s_1)
*请记住,要在“ for”循环之前使用“值”,“日期”和“卫星”作为键来创建字典。
(ii)将字典'd'转换为数据框:
data = pd.DataFrame(d)
(iii)最后将您的数据框转换为csv:
data.to_csv(<filepath/filename.csv>)
看到您的代码:
只需更改“ for”循环中的行
date = np.repeat(image[3:8], len(new_array))
#similarly for the satellite name
将所有三个变量推到字典上
在for循环结束之后,将字典转换为数据框,然后转换为csv。
如有任何疑问,请发表评论。
希望有帮助。
答案 1 :(得分:0)
使用带有pandas.DataFrame
的熊猫创建一个columns=['Value', 'Date', 'Satellite']
,并通过将当前数据帧与该图像中的新数据串接起来,为每个图像在数据帧中追加新数据。
对于在每个图像上生成的数据框,您需要重复日期和卫星信息。您也可以使用pd.to_datetime
将日期转换为大熊猫日期格式。它应该看起来像这样:
import pandas as pd
import numpy
image_list = ["D:/6.10.SkySat.tif", "D:/06.30.SkySat.tif", "D:/06.06.RapidEye.tif",
"D:/06.16.RapidEye.tif", "D:/06.26.PlanetScope.tif", "D:/06.30.PlanetScope.tif"]
df = pd.DataFrame(columns=['Value', 'Date', 'Satellite'])
for image in image_list:
#converting raster image to numpy array
array = arcpy.RasterToNumPyArray(image, nodata_to_value=9999)
#masking out the no data value and converting into one dimentional array
marray = numpy.ma.masked_values(array,9999)
new_array = marray.flatten()
#extracting the date and satellite name
date = pd.datetime(image[3:8], ignore_errors=True)
satellite = image[9:-4]
df2 = pd.DataFrame({'Value': new_array, 'Date':[date]*new_array.size, 'Satellite':[satellite]*new_array.size})
df = pd.concat([df,df2], ignore_index=True)
print(df) # Should output your expected columns