我收到各種格式的日期或日期的部分並將它們獲得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
,但是我不得不擔心我的子類沒有受到任何損害,並且是否可以使用來自交互式工作的一些腳本來移植其他人。
任何其他解決方案,將不勝感激。
如果您認爲沒有比繼承或編寫大量這些幫助函數更好的方法,那很好,但我寧願留下意見並回答只有對於任何不同於此的提案 - 而不是得到很多答覆,說「這看起來很好」或什麼的。
完美,這就是我一直在尋找的。 – ely