English 中文(简体)
案文文档之间的日期/时间转换
原标题:Python date/time conversion between text files

我有一份水文模型文件输出(出口)。

Units CFS
Type INST-VAL
1 01 Jan 1997, 02:00 1933.0
2 01 Jan 1997, 04:00 1918.0
3 01 Jan 1997, 06:00 1918.0
4 01 Jan 1997, 08:00 1904.0
5 01 Jan 1997, 10:00 1904.0
...


并且已经将 Python(2.6)编码为优化过程的投入格式:

import re
o=open("C:documents and settingscmjawdydesktopPyOut.txt","w")
data=open("C:documents and settingscmjawdydesktopexport.txt").read()
Step1=re.sub(":00",":00:00",data)
Step2=re.sub(" Jan ","/01/",Step1)
Step3=re.sub(",","",Step2)
FindIDs=re.compile("^[0-9]*s",re.M)
Step4=re.sub(FindIDs,"SiteXXX ",Step3)
o.write(Step4)
o.close()

屈服:

Units CFS
Type INST-VAL
SiteXXX 01/01/1997 02:00:00 1933.0
SiteXXX 01/01/1997 04:00:00 1918.0
SiteXXX 01/01/1997 06:00:00 1918.0
SiteXXX 01/01/1997 08:00:00 1904.0
SiteXXX 01/01/1997 10:00:00 1904.0
...


问题在于,我的优化软件的小时数为24小时,而第二天的小时数为00。 因此,我需要将X日24:00改为X+1日00:00,同时保持同样的格式。 它看上去的是,有24小时/直径。 这些是我绝对的第一行,即任何电脑语言,我找不到改变这一文本的leg。

问题回答
import datetime
s =    1 01 Jan 1997, 02:00 1933.0
2 01 Jan 1997, 04:00 1918.0
3 01 Jan 1997, 06:00 1918.0
4 01 Jan 1997, 08:00 1904.0
5 01 Jan 1997, 10:00 1904.0
6 01 Jan 1997, 24:00 1000.0   
for row in s.split( 
 ):
    prefix = row[:2]
    sdate = row[2:-7]
    suffix = row[-7:]
    if sdate[13:15] ==  24 :
        offset = datetime.timedelta(1)
        sdate = sdate[:13] +  00  + sdate[15:]
    else:
        offset = datetime.timedelta(0)
    dt = datetime.datetime.strptime(sdate,  %d %b %Y, %H:%M ) + offset
    print prefix + dt.strftime( %d/%m/%Y %H:%M:%S ) + suffix

结果:

1 01/01/1997 02:00:00 1933.0
2 01/01/1997 04:00:00 1918.0
3 01/01/1997 06:00:00 1918.0
4 01/01/1997 08:00:00 1904.0
5 01/01/1997 10:00:00 1904.0
6 02/01/1997 00:00:00 1000.0

下面的法典解决了几天之后的第二天的问题,以便找到一条线上的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

=========================================================




相关问题
Mysql compaire two dates from datetime?

I was try to measure what is faster and what should be the best way to compare two dates, from datetime record in MySql db. There are several approaches how to grab a date from date time, but I was ...

iPhone Date Picker rolls over to 2010 on December 27th?

So I implemented a UIDatepicker in one of my applications for scheduling and autodialing teleconferences... everything is pretty much ready to go except, while testing I noticed that when the date ...

Convert date Python

I have MMDDYY dates, i.e. today is 111609 How do I convert this to 11/16/2009, in Python?

specifying date format when using $form->inputs() in CakePHP

I am wondering if there is a way to specify the date format in the forms created using CakePHP s $form->inputs(); Please note that this is not the individual $form->input() but instead $form->inputs() ...

NSDateFormat, super simple! Where am I screwing up?

Ok, this is really simple, maybe I m a getting a bit burnt out, but seems like it should work, Query XML feed, put out date string, format, display in a cell. The issue is I m a getting a NULL ...

sqlite writing a date into an email

I am exporting a date value from sqlite and placing it into an email. The date appears like this 279498721.322872 I am using Objective C in an Iphone App. Does anyone know how to make this export ...

热门标签