The geospatial data abstraction library is awesome!
With gdal_merge.py you can merge tiles of geospatial data together so that instead of multiple images you have one image. See the two images we want to merge below.

Find a link to two example data sets here. Extract the files into one folder.
In QGIS
Step 1: Go to Raster -> miscellaneous -> Merge
Step 2: Choose “input directory instead of files” and select the folder with the files you want to merge.
Step 3: Fill out the name of the output file.
Step 4: We add the nodata value (9999.990234375) by hand using the edit button.
Step 5: Press the Ok button.

To clean the data up we add a gdalwarp command.
Step 6: Go to raster -> projections -> warp (reproject)
Step 7: Fill out the inputfile, output file, source SRS, Target SRS and nodata values

Command line
You can of course also directly run the code constructed in QGIS in your terminal.
gdal_merge.py -n 9999.990234375 -of GTiff -o /path/to/myoutputfile.tif /path/to/inputfile1.tif /path/to/inputfile2.tif /path/to/inputfileX.tif gdalwarp -s_srs EPSG:4326 -t_srs epsg:4326 -dstnodata 0 -of GTiff /path/to/myoutputfile.tif /path/to/newoutputfile.tif
When you have a large number of files it is better to construct a string of the command in python and execute this automatically:
import os
# three horizontal tiles
horizontaltiles = [27,28,29]
# horizontal tiles have different set of vertical tiles
verticaltiles = [[6,7,8],[6,7,8,9],[6,7,8,9]]
# location of the files
pathname = "/path/to/"
# the basename
basename ="ETensemble250m"
# for all years
for year in range(2003,2015,1):
# for all months
for month in range(1,13,1):
# the gdal_merge command
command = "gdal_merge.py -n 9999.990234375 -of GTiff -o "
# the output name
outputname = pathname + "ET_ensemble_" + str(year) + "-" + str(month) + "-01_temp.tif "
# set the string here. We want the command to run for each month in all years
command = command + outputname
# for all horizontal tiles horizontal tiles
for h in horizontaltiles:
# get index of hortizontal tile
myindex = horizontaltiles.index(h)
# for all vertica tiles
for v in verticaltiles[myindex]:
tile = "h" + str(h) + "v" + str(v)
thedate = str(year) + "-" + str(month) + "-01"
command = command + pathname + basename + "-" + tile + "-"+ thedate + ".tif "
print " "
print command
# run gdal_merge.py tool with os call
os.system(command)
# warp to clean up data
newoutputname = pathname + "ET_ensemble_" + str(year) + "-" + str(month) + "-01.tif "
warpcommand = "gdalwarp -s_srs EPSG:4326 -t_srs epsg:4326 -dstnodata 0 -of GTiff " + outputname + " " + newoutputname
print " "
print warpcommand
# execute gdalwarp command with os call
os.system(warpcommand)