putting date strings in order

noydb jenn.duerr at gmail.com
Thu May 14 19:41:17 CEST 2009


On May 12, 12:26 pm, John Machin <sjmac... at lexicon.net> wrote:
> On May 13, 1:58 am, Jaime Fernandez del Rio <jaime.f... at gmail.com>
> wrote:
>
>
>
>
>
> > On Tue, May 12, 2009 at 5:02 PM, MRAB <goo... at mrabarnett.plus.com> wrote:
> > > John Machin wrote:
>
> > >> MRAB <google <at> mrabarnett.plus.com> writes:
>
> > >>> Sort the list, passing a function as the 'key' argument. The function
> > >>> should return an integer for the month, eg 0 for 'jan', 1 for 'feb'. If
> > >>> you want to have a different start month then add
>
> > >> and if you don't like what that produces, try subtract :-)
>
> > > Oops!
>
> > >>> the appropriate
> > >>> integer for that month (eg 0 for 'jan', 1 for 'feb') and then modulo 12
> > >>> to make it wrap around (there are only 12 months in a year), returning
> > >>> the result.
>
> > > Actually, subtract the start month, add 12, and then modulo 12.
>
> > Both on my Linux and my Windows pythons, modulos of negative numbers
> > are properly taken, returning always the correct positive number
> > between 0 and 11. I seem to recall, from my distant past, that Perl
> > took pride on this being a language feature. Anyone knows if that is
> > not the case with python, and so not adding 12 before taking the
> > modulo could result in wrong results in some implementations?
>
> If that happens, it's a bug.http://docs.python.org/reference/expressions.html#binary-arithmetic-o...
>
> If you look at function i_divmod() in the 2.x branch's Objects/
> intobject.c, you'll be reassured to see that it doesn't just take
> whatever C serves up :-)- Hide quoted text -
>
> - Show quoted text -

Thanks to those who provided suggestions.  I ended up using code
similar to what Jaime provided above first -- truly eloquent and
simple, especially compared to my original thoughts of several messy
loops.  I knew it could be done way better.  Thanks very much Jaime!!
That was a good learning experience for me.

fairly finished portion of code:

ordered_raster_list = []

pRasters = gp.ListRasters("precip_*", "All") # an enumeration object,
arcgis method
pRast = pRasters.next()
while pRast:
##    month = pRast[-3:]
##    print month
    print pRast
    ordered_raster_list.append(pRast)
    pRast = pRasters.next()


print ordered_raster_list #unordered at this point

# create a dictionary dictating the order of the the precip_<months>
rasters
monthsD = {"precip_jan" : 1, "precip_feb" : 2, "precip_mar" : 3,
"precip_apr" : 4, "precip_may" : 5, "precip_jun" : 6,
           "precip_jul" : 7, "precip_aug" : 8, "precip_sep" : 9,
"precip_oct" : 10, "precip_nov" : 11, "precip_dec" : 12}

# sort the list based on the dictionary
ordered_raster_list.sort(None, lambda x : monthsD[x])

print ordered_raster_list #ordered

start = 2 #user to define, starting month

ordered_raster_list = ordered_raster_list[start - 1:] +
ordered_raster_list[:start - 1]

print ordered_raster_list #ordered but starting in the middle, feb in
this case, ending with jan



More information about the Python-list mailing list