如何将字符串从2012年11月14日切换到2012年11月14日,而不在Python中转换为日期时间?

2024-04-19 01:43:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我必须分析几个日志文件,我是随机顺序阅读。为了处理他们排序,我需要按提取的日志时间排序。你知道吗

日志条目如下所示:

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,最好在上面的split语句中包含able。。。你知道吗

问题:
如何修改字符串日期而不将其转换为datetime对象?你知道吗


Tags: 文件对象字符串datetime排序顺序request时间
2条回答

此代码将起作用:

# 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中的散列操作也可能更快。至少值得一试。你知道吗

Nayuki Minase's solution为例:

# 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"]
_MONTHS = dict((m, n + 1) for n, m in enumerate(_MONTHS)) # {"Jan": 1, "Feb: 2, ...} 
def convert(s):
  p = s.split(':', 1)
  t = p[0].split('/')
  return "%s-%02d-%02d:" % (t[2], _MONTHS[t[1]], int(t[0])) + p[1]

甚至(为了节省时间)

  return "%s-%02d-%s:" % (t[2], _MONTHS[t[1]], t[0]) + p[1]

如果你能确定这一天已经有了正确的格式(前导0)。你知道吗

相关问题 更多 >