2012-05-15 38 views
0

實際上,我在尋找這個問題的反面: Converting string into datetime的Python:從日期時間列表創建人性化的串

我有datetime對象的名單,我想創造一個人性化的字符串 ,例如「2012年2月4日1月27日和30日」。有任何想法嗎?

請注意,strftime僅適用於單個日期時間對象。這裏的問題是,你有一個日期時間表,它可能不是均勻間隔的,可能跨越月份或年份邊界,但是整個日期範圍必須用單一簡潔的字符串表示。

+4

你看了'strftime'方法? –

+0

適用於單個日期時間對象。我需要獲取日期時間對象的列表並創建單個字符串,例如: [(2012,05,23),(2012,05,30),(2012,06,06)] 變爲 'Weds。 2012年5月23日 - 6月6日' 正如您所指出的,轉換SINGLE日期時間對象很容易。轉換一系列跨越月份甚至年份邊界的日期時間對象需要更優雅的東西。在我花時間/ $$$寫這篇文章之前,我認爲看看其他人是否遇到過解決方案會很有幫助。 –

+0

所以你需要獲得日期範圍?如「從2011年1月27日到2013年7月22日」? – jadkik94

回答

7

This。你爲什麼不閱讀文檔?

your_date.isoformat() # -> '2002-03-11' 
your_date.strftime("%A %d. %B %Y") # -> Monday 11. March 2002 

UPDATE:您需要列表理解這樣做在同一行。

date_strings = [dt.strftime("%A %d. %B %Y") for dt in your_date_list] 

或者,使用一個for循環:

date_strings = [] 
for dt in your_date_list: 
    date_str.append(dt.strftime("%A %d. %B %Y")) 

更新2:我相信這是更接近你所期望的,但你仍然想要的東西,只有你知道它:你什麼時候想要顯示一年,什麼時候不顯示?何時只顯示月份或日期等...但這基本上是一個想法。你可能會做某種類來表示範圍,在那裏你可以選擇格式,比較範圍之間的月份和年份,......這就是我現在想出的。希望它能幫助:

import datetime 

# sample input 
dates = [datetime.date(2012, 5, 21), datetime.date(2012, 5, 23), 
     datetime.date(2012, 5, 25), datetime.date(2012, 5, 19), 
     datetime.date(2012, 5, 17), datetime.date(2012, 5, 26), 
     datetime.date(2012, 5, 18), datetime.date(2012, 5, 20)] 

def get_consecutive_ranges(dates): 
    dates = sorted(dates) 

    delta_1day = datetime.timedelta(days=1) 
    ranges = [] 
    last_d = dates[0] 
    tmp_range = [last_d, None] 
    for d in dates[1:]: 
     if d-last_d <= delta_1day: 
      # the difference between the dates is less than a day 
      # we can extend the range, update the right-most boundary 
      tmp_range[1] = d 
     else: 
      ranges.append(tmp_range) 
      tmp_range = [d, None] 
     last_d = d 
    else: 
     ranges.append(tmp_range) 
    return ranges 

ranges = get_consecutive_ranges(dates) 

fmt = "%d %b %Y" 

output = ", ".join([("%s" % (r[0].strftime(fmt),)) if r[1] is None else \ 
      ("%s-%s" % (r[0].strftime(fmt), r[1].strftime(fmt))) \ 
      for r in ranges]) 

print output 
+0

因爲我確實閱讀過文檔,並且您回答了錯誤的問題。 –

+0

我更新了我的答案。我很抱歉,你應該讓你的問題更清楚...... :)如果你願意,你可以隨時編輯它。 – jadkik94

+0

謝謝。我已經修改了這個問題,但問題在於使單個字符串簡潔。這不僅僅是將轉換的單個日期列表連接起來。 這種情況是在一個網站上表達一系列廣播,只允許非常有限的空間這樣做。所以,雖然很容易得到[(2012,11,28),(2012,12,5),(2012,12,12),(2012,12,19)]的列表,將其改爲「2012年11月28日,2012年12月5日至19日」不是簡單的(甚至在一個月後,當你有2012年和2013年等時,更糟糕「 如果預算有時間,我自己會寫得很好對我來說這樣做 –

1
>>> dt=datetime.date(2012,2,4) 
>>> dt.strftime('%A %B %d, %Y') 
'Saturday February 04, 2012' 
+1

是的,這適用於SINGLE日期時間對象。問題是這是一個日期範圍(可能是也可能不是均勻間隔,可能跨越月邊界,可能跨越年份邊界等需要封裝到單個字符串中。因此,strftime沒有幫助。我沒有更清楚地表達這個問題。 –

相關問題