2014-02-10 56 views
2

我收到各種格式的日期或日期的部分並將它們獲得datetime.date格式後,我想調整月份字段或日期字段沒有調用構造函數以獲取全新的datetime.date對象。更改datetime.date的一天或一個月沒有子類或使用構造函數的幫助器函數

的數據可以是下列任何類型的東西:

'2012.01.01' 
'194311' 
'1865/08/30' 
'1701' 
... etc 

對於尚未得以確認的日期,我會想他們要麼推到1月1日第一所提供的一個月,到年底提供的月份,或到12月31日。一年必須提供,不會改變。

dateutil.parser.parse處理所有的這些好聽,除了它在缺少個月和/或天當月和/或天填充約定:

In [11]: dateutil.parser.parse('2012/04') 
Out[11]: datetime.datetime(2012, 4, 10, 0, 0) 

In [12]: dateutil.parser.parse('1865') 
Out[12]: datetime.datetime(1865, 2, 10, 0, 0) 

In [13]: dateutil.parser.parse('1920.03.27') 
Out[13]: datetime.datetime(1920, 3, 27, 0, 0) 

進入datetime.datetime格式後,我可以打電話datetime功能date有效地投入爲datetime.date,因此這部分是微不足道的。

我想什麼,以避免被寫一個輔助函數必須通過調用構造函數的痛苦,就像這樣:

def adjust_to_jan1(date_str): 
    temp = dateutil.parser.parse(date_str).date() 
    return datetime.date(temp.year, 1, 1) 

def adjust_to_month_end(date_str): 
    import calendar 
    temp = dateutil.parser.parse(date_str).date() 
    last_day = calendar.monthrange(temp.year, temp.month) 
    return datetime.date(temp.year, temp.month, last_day) 

def adjust_to_last_weekdat(date_str): 
    import calendar 
    temp = dateutil.parser.parse(date_str).date() 
    last_weekday = max([elem for x in calendar.monthcalendar(temp.year, 
                  temp.month) 
         for elem in x[0:5]]) 
    return datetime.date(temp.year, temp.month, last_weekday) 

由於我經常以交互方式處理這些數據,所以定義這些類型的樂趣會變得非常痛苦所有的時間。它變得更加複雜:上週的一天,這不是一個任意的國家組的假期...除了它可以在上個星期六,如果年份是在某一年之前......

我想要做的只是聲明我要的改變,如:

some_date = datetime.date(2012, 1, 20) 
some_date.day = 1 

但是,這是不允許的。

我可以繼承datetime,但是我不得不擔心我的子類沒有受到任何損害,並且是否可以使用來自交互式工作的一些腳本來移植其他人。

任何其他解決方案,將不勝感激。

如果您認爲沒有比繼承或編寫大量這些幫助函數更好的方法,那很好,但我寧願留下意見並回答只有對於任何不同於此的提案 - 而不是得到很多答覆,說「這看起來很好」或什麼的。

回答

相關問題