下面的法典解决了几天之后的第二天的问题,以便找到一条线上的244天:1月31日、2月28日、2月29日、6月30日、12月31日等。
import re
ss1 = Units CFS
Type INST-VAL
1 01 Jan 1997, 02:00 1933.0
2 12 Feb 1997, 04:00 1918.0
3 26 May 1997, 06:00 1918.0
4 15 Aug 1997, 08:00 1904.0
5 09 Dec 1997, 10:00 1904.0
ss2 = Units CFS
Type INST-VAL
1 31 Jan 1997, 11:00 1933.0
2 28 Feb 1997, 11:00 1918.0
2 29 Feb 1997, 11:00 1918.0
3 31 Mar 1997, 11:00 1918.0
4 30 Sep 1997, 11:00 1904.0
5 31 Dec 1997, 11:00 1904.0
ss3 = Units CFS
Type INST-VAL
1 31 Jan 1997, 24:00 1933.0
2 28 Feb 2011, 24:00 1700.2
2 29 Feb 2011, 24:00 1700.0
2 28 Feb 2012, 24:00 1801.8
2 29 Feb 2012, 24:00 1801.0
3 31 Mar 1997, 24:00 1918.0
4 30 Sep 1997, 24:00 1904.0
5 31 Dec 1997, 24:00 1904.0
bis = ( 1904 , 1908 , 1912 , 1916 , 1920 , 1924 , 1928 , 1932 , 1936 , 1940 ,
1944 , 1948 , 1952 , 1956 , 1960 , 1964 , 1968 , 1972 , 1976 , 1980 ,
1984 , 1988 , 1992 , 1996 , 2000 , 2004 , 2008 , 2012 , 2016 , 2020 ,
2024 , 2028 , 2032 , 2036 , 2040 , 2044 , 2048 , 2052 , 2056 , 2060 ,
2064 , 2068 , 2072 , 2076 , 2080 , 2084 , 2088 , 2092 , 2096 , 2104 )
months = dict(zip( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec .split(),xrange(1,13)))
firstday_nextmonth = {( 31 , Jan ): 01/02/ , ( 31 , Mar ): 01/04/ ,
( 30 , Apr ): 01/05/ , ( 31 , May ): 01/06/ , ( 30 , Jun ): 01/07/ ,
( 31 , Jul ): 01/08/ , ( 31 , Aug ): 01/09/ , ( 30 , Sep ): 01/10/ ,
( 31 , Oct ): 01/11/ , ( 30 , Nov ): 01/12/ , ( 31 , Dec ): 01/01/ }
di = { 1 : MADRID , 2 : HUAHINE , 3 : MOSCOW , 4 : OSAKA , 5 : VALPAR. }
def repl(mat, fdnm = firstday_nextmonth, months = months, sites = di, bisextiles = bis):
d,m,y = mat.group(2,3,4)
if mat.group(5)== 24:00 :
if (d,m)==( 31 , Dec ):
dmy = 01/01/%d % (int(y)+1)
elif (d,m) == ( 29 , Feb ):
if y in bisextiles:
dmy = 01/03/ + y
else:
dmy = !!!!!!!!!!
elif (d,m)==( 28 , Feb ):
if y in bisextiles:
dmy = 29/02/ + y
else:
dmy = 01/03/ + y
elif (d,m) in fdnm:
dmy = fdnm[(d,m)] + y
else:
dmy = %02d/%02d/%s % (int(mat.group(2))+1,months[m],y)
elif (d,m) == ( 29 , Feb ) and y not in bisextiles:
dmy = !!!!!!!!!!
else:
dmy = %s/%02d/%s % (d,months[m],y)
return %s %s %s:00 % (sites[mat.group(1)],
dmy,
mat.group(5).replace( 24:00 , 00:00 ))
reg = re.compile( ^(d+) ([012]d|30|31) ([a-z]+) (d{4}), (dd:dd)(?= d+.d+) ,
re.IGNORECASE|re.MULTILINE)
for ss in (ss1,ss2,ss3):
print ss
print
print reg.sub(repl,ss)
print
=========================================================
结果
Units CFS
Type INST-VAL
1 01 Jan 1997, 02:00 1933.0
2 12 Feb 1997, 04:00 1918.0
3 26 May 1997, 06:00 1918.0
4 15 Aug 1997, 08:00 1904.0
5 09 Dec 1997, 10:00 1904.0
Units CFS
Type INST-VAL
MADRID 01/01/1997 02:00:00 1933.0
HUAHINE 12/02/1997 04:00:00 1918.0
MOSCOW 26/05/1997 06:00:00 1918.0
OSAKA 15/08/1997 08:00:00 1904.0
VALPAR. 09/12/1997 10:00:00 1904.0
=========================================================
Units CFS
Type INST-VAL
1 31 Jan 1997, 11:00 1933.0
2 28 Feb 1997, 11:00 1918.0
2 29 Feb 1997, 11:00 1918.0
3 31 Mar 1997, 11:00 1918.0
4 30 Sep 1997, 11:00 1904.0
5 31 Dec 1997, 11:00 1904.0
Units CFS
Type INST-VAL
MADRID 31/01/1997 11:00:00 1933.0
HUAHINE 28/02/1997 11:00:00 1918.0
HUAHINE !!!!!!!!!! 11:00:00 1918.0
MOSCOW 31/03/1997 11:00:00 1918.0
OSAKA 30/09/1997 11:00:00 1904.0
VALPAR. 31/12/1997 11:00:00 1904.0
=========================================================
Units CFS
Type INST-VAL
1 31 Jan 1997, 24:00 1933.0
2 28 Feb 2011, 24:00 1700.2
2 29 Feb 2011, 24:00 1700.0
2 28 Feb 2012, 24:00 1801.8
2 29 Feb 2012, 24:00 1801.0
3 31 Mar 1997, 24:00 1918.0
4 30 Sep 1997, 24:00 1904.0
5 31 Dec 1997, 24:00 1904.0
Units CFS
Type INST-VAL
MADRID 01/02/1997 00:00:00 1933.0
HUAHINE 01/03/2011 00:00:00 1700.2
HUAHINE !!!!!!!!!! 00:00:00 1700.0
HUAHINE 29/02/2012 00:00:00 1801.8
HUAHINE 01/03/2012 00:00:00 1801.0
MOSCOW 01/04/1997 00:00:00 1918.0
OSAKA 01/10/1997 00:00:00 1904.0
VALPAR. 01/01/1998 00:00:00 1904.0
=========================================================