2015-10-19 55 views
-2

我有日期已混合的格式一樣的列表:將字符串轉換日期與混合格式劃時代

01-01-13 
01-12-13 
1/19/2013 
1/21/2013 
1/21/2013 
1/30/2013 
02-01-13 
02-02-13 
02-12-13 
2/13/2013 
2/23/2013 
... 

我想這個列表轉化爲劃時代的列表(以保持它在SQLite的分貝在Android)。所以我寫了一個腳本(基於this)將其轉換:

#!/usr/bin/python 

import time 

with open('date.txt') as f: 
    mylist = f.read().splitlines() 
    for date_time in mylist: 
     if "/" in date_time: 
      pattern = '%d/%m/%Y' 
     else: 
      pattern = '%d-%m-%Y' 
     epoch = int(time.mktime(time.strptime(date_time, pattern))) 
     print epoch 

但它與第一​​個條目失敗:

Traceback (most recent call last): 
    File "dateconv.py", line 11, in <module> 
    epoch = int(time.mktime(time.strptime(date_time, pattern))) 
    File "/usr/lib/python2.7/_strptime.py", line 467, in _strptime_time 
    return _strptime(data_string, format)[0] 
    File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '01-01-13\r\n' does not match format '%d-%m-%Y' 
[email protected]:~/Downloads$ python dateconv.py 
Traceback (most recent call last): 
    File "dateconv.py", line 12, in <module> 
    epoch = int(time.mktime(time.strptime(date_time, pattern))) 
    File "/usr/lib/python2.7/_strptime.py", line 467, in _strptime_time 
    return _strptime(data_string, format)[0] 
    File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '01-01-13' does not match format '%d-%m-%Y' 

EDIT1:

感謝AJSP的回答我已更改爲:

#!/usr/bin/python 

import time 

with open('date.txt') as f: 
    mylist = f.read().splitlines() 
    for date_time in mylist: 
     if "/" in date_time: 
      pattern = '%d/%m/%Y' 
     else: 
      pattern = '%d-%m-%y' 
     epoch = int(time.mktime(time.strptime(date_time, pattern))) 
     print epoch 

但它仍然失敗:

1356994800 
1356994800 
1356994800 
1356994800 
1367359200 
1372629600 
1372629600 
1372629600 
1380578400 
1385852400 
Traceback (most recent call last): 
    File "dateconv.py", line 12, in <module> 
    epoch = int(time.mktime(time.strptime(date_time, pattern))) 
    File "/usr/lib/python2.7/_strptime.py", line 467, in _strptime_time 
    return _strptime(data_string, format)[0] 
    File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '1/19/2013' does not match format '%d/%m/%Y' 

由於缺少前導0,因爲文檔說Month as a zero-padded decimal number

+0

它不起作用,因爲您沒有按照正確順序的日 - 月 - 年方向。你不可能有19個月,因爲一年只有12個。複製並粘貼下面的代碼,它與您提供的樣本數據一起工作。 – ajsp

+0

@ajsp這不是19個月,它是1月19日。 –

+0

嘗試將問題限制爲單個問題(您的第一個問題是%Y - >%y,第二個問題%d /%m - >%m /%d)。儘管[@ ajsp的回答](http://stackoverflow.com/a/33209275/4279)修復了這兩個問題。 – jfs

回答

2

閱讀datetime documentation

%Y比賽「一年世紀的十進制數」,如2013年
%y比賽「一年不世紀,零填充十進制數」,如13

試試這個,你應該多花點功夫!

import time 
with open('date.txt') as f: 
    mylist = f.read().splitlines() 
    for date_time in mylist: 
     if "/" in date_time: 
      pattern = '%m/%d/%Y' 
      print "1", pattern 
     else: 
      print "2" 
      pattern = '%m-%d-%y' 
     epoch = int(time.mktime(time.strptime(date_time, pattern))) 
     print epoch 

希望它有幫助。

+0

謝謝'它有幫助,但輸入文件格式是錯誤的,它現在在不同的地方失敗,看到更新的問題。 –

0

最簡單的方法是使用名爲dateutil的第三方庫,它可以通過pip/easy_install進行安裝 - 這樣可以避免您自己編寫所有「如何處理不同格式的日期」邏輯。

from dateutil.parser import parse 

for line in f.read().splitlines(): 
    dt = parse(line) 
    print(dt, int(dt.timestamp())) 

它給你:

2013-01-01 00:00:00 1356998400 
2013-01-12 00:00:00 1357948800 
2013-01-19 00:00:00 1358553600 
2013-01-21 00:00:00 1358726400 
2013-01-21 00:00:00 1358726400 
2013-01-30 00:00:00 1359504000 
2013-02-01 00:00:00 1359676800 
2013-02-02 00:00:00 1359763200 
2013-02-12 00:00:00 1360627200 
2013-02-13 00:00:00 1360713600 
2013-02-23 00:00:00 1361577600 

如果你不希望使用第三方庫,然後的而不是使用strptime,提取成分,並以此作爲int s到datetime代替。這給出了與上面相同的結果:

from datetime import datetime 
import re 

for line in f.read().splitlines(): 
    m, d, y = map(int, re.split('[-/]', line)) 
    # use a more appropriate cut-off if needs be 
    # this assumes any two digit year is meant to be 2000 
    if y < 100: 
     y += 2000 
    dt = datetime(y, m, d) 
    print(dt, int(dt.timestamp())) 
相關問題