如何在不转换为Python中的datetime的情况下将字符串从2012年11月14日切换到2012年11月14日?

如何在不转换为Python中的datetime的情况下将字符串从2012年11月14日切换到2012年11月14日?,python,string,datetime,logging,converter,Python,String,Datetime,Logging,Converter,也许是个奇怪的问题,但我们来看看: 我必须解析几个日志文件,我以随机顺序读取它们。为了对它们进行排序,我需要按照提取的日志时间进行排序 日志条目如下所示: l = 2001:470:1f14:169:5000:eae0:589d:c211 - SOFT12 [14/Nov/2012:09:32:46 +0100] "POST /request HTTP/1.1" 200 984 "-" "-" 181446 l.split('+', 1)[0].split('-', 1)[1].split('

也许是个奇怪的问题,但我们来看看:

我必须解析几个日志文件,我以随机顺序读取它们。为了对它们进行排序,我需要按照提取的日志时间进行排序

日志条目如下所示:

l = 2001:470:1f14:169:5000:eae0:589d:c211 - SOFT12 [14/Nov/2012:09:32:46 +0100] "POST /request HTTP/1.1" 200 984 "-" "-" 181446
l.split('+', 1)[0].split('-', 1)[1].split(' ')[2].split('[')[1]
我可以这样提取日期:

l = 2001:470:1f14:169:5000:eae0:589d:c211 - SOFT12 [14/Nov/2012:09:32:46 +0100] "POST /request HTTP/1.1" 200 984 "-" "-" 181446
l.split('+', 1)[0].split('-', 1)[1].split(' ')[2].split('[')[1]
这给了我:

14/Nov/2012:09:32:46
当我看到每天有超过200万条记录的日志文件时,我不想把任何东西转换成datetime对象,这样我就可以切换格式和排序。因此,我正在寻找一个仅限字符串的操作,该操作可以将字符串的日期部分
14/Nov/2012
切换为可排序的
2012-11-14
,最好在我的方便的拆分语句中包含able从上面

问题:
如何在不将字符串日期转换为datetime对象的情况下修改它?

此代码可以工作:

# Converts something like "14/Nov/2012:09:32:46"
# to "2012-11-14:09:32:46"
_MONTHS = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
def convert(s):
  p = s.split(':', 1)
  t = p[0].split('/')
  return "%s-%02d-%02d:" % (t[2], _MONTHS.index(t[1]) + 1, int(t[0])) + p[1]

与其使用列表和它的
.index()
方法,不如使用dict,因为列表将涉及线性搜索。即使列表很短,dict中的哈希操作也可能更快。至少值得一试

因此,采取以下措施:

甚至(为了节省时间)


如果你能确定一天的格式是正确的(前导0)。

用斜线分割,选择转换数组,将所有内容连接起来。考虑到日期和时间的复杂性,我个人会咬紧牙关,直接转换为DateTime。当我查看近10亿条记录时,我真的不希望字符串转换中出现细微的错误,导致0.01%的结果出错。细微错误的潜在来源:logs.mh中的夏令时转换。没错,但现在的首要任务是“处理时间”。从你的问题来看,这听起来像是一次性操作——不管哪种方式都可能只需要几分钟就可以运行?但是,如果您确信日志时间戳总是来自同一时区,并且与DST没有太多有趣的关系,那么@lc的方法就更简单,并且对于您的目的来说可能已经足够好了。旁注:您可能可以减少用于获取日期的拆分次数,例如
l.split(“+”,1)[0]。split(“[”,1)[1]
给出了
'14/Nov/2012:09:32:46'
。这应该可以为您每行节省几纳秒。很好!我不知道我需要多长时间才能想出这个…谢谢!我已经从使用dict切换到使用list,这会减少几毫秒。仍然会尝试一下。如果您对我的答案或建议发表评论,那会很好d编辑,而不是复制它并做出自己的答案。谢谢。@NayukiMinase编辑会破坏你的版本-这也是有效的。评论将是一个选项。但正如我清楚地表明代码是谁的简略,我不认为有什么大问题。。。