2015-10-19 57 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())) 
相关问题