Python:将字符串时间字典转换为日期时间

7

我有一个名为alerts[]的字典,其中包含键alert_date。所有日期/时间均以字符串形式存储。我在Django中显示日期,但模板无法格式化存储为字符串的时间。因此,我希望在我的视图中将其转换为如下形式:

foo = "2014-10-07 00:00:00"
bar = datetime.strptime(foo, "%Y-%m-%d %H:%M:%S")

但是,我希望一次性转换所有字典时间值。我通过API调用以JSON格式抓取字典。我想做像这样的事情(显然这是无效的代码):
alerts = resp_data['alerts']
for v in alerts['alert_date']:
    v = datetime.strptime(v, "%Y-%m-%d %H:%M:%S")

//编辑: JSON响应是一个包含alerts的字典,其中alerts是以下格式的字典列表:

{"alerts": [
    {
      "key1": "value11",
      "key2": "value12",
      "key3": "value13",
      "alert_date": "2014-06-05 01:00:23.633000",
    },
    {
      "key1": "value21",
      "key2": "value22",
      "key3": "value23",
      "alert_date": "2010-12-31 00:00:00",
    }
]}

请也将警报变量的确切内容发布出来。您可以替换值,但我需要了解它真正包含的内容。 - DevLounge
@Apero 我没有说这是一个字典列表。问题已更新。谢谢! - Kilpatrick
4个回答

7

编辑: 现在你添加了一些样本JSON响应数据,我知道这个答案是正确的,alerts是一个字典列表:

从你的示例中,我现在假设:

  • alerts 是一个 alert 字典的列表
  • alert ['alert_date'] 是一个日期字符串

因此,我建议您执行以下操作:

alerts = resp_data['alerts']
for alert in alerts:
    alert['alert_date'] = datetime.strptime(alert['alert_date'], "%Y-%m-%d %H:%M:%S")

我不得不将第二行更改为for alert in alerts:,但除此之外它工作正常。谢谢! - Kilpatrick
正如@Kasramvd所提到的,我的strptime示例期望特定的格式。但是在我的样本数据(“2014-06-05 01:00:23.633000”)中没有满足这个要求。我还不得不切换数据源以使用具有一致时间格式的数据才能使其工作。 - Kilpatrick
是的,数据源的完整性和一致性是最重要的。当然,在这个循环中可以加入 try / except 语句。 - DevLounge
你也可以使用这个http://dateutil.readthedocs.org/en/latest/parser.html。只要小心并设置dayfirst或yearfirst选项。 - DevLounge

5
你可以使用字典推导式:
```python ```
new_dict = {datetime.strptime(key, "%Y-%m-%d %H:%M:%S"): val for key, val in alerts['alert_date'].items()}

还要注意的是,由于你使用了指定格式的 datetime.strptime 函数,可能会出现 ValueError 异常。在这种情况下,字典推导式就没有什么用了。因此,如果你不确定日期的格式,需要处理异常:

new_dict = {}
for k, v in alerts['alert_date'].items():
    try:
        new_dict[datetime.strptime(k, "%Y-%m-%d %H:%M:%S")] = v 
    except ValueError:
        new_dict[datetime.strptime(k, "%Y-%m-%d %H:%M:%S")] = '' # or what you want

0

如果我理解正确,您想要仅更改“警报(alerts)”列表字典中的日期字符串,而保留其他键/值不变。我建议采用以下方法:

from datetime import datetime

fmt = "%Y-%m-%d %H:%M:%S"
alerts = map(lambda x: dict(x, **{'alert_date': datetime.strptime(x['alert_date'], fmt)}), alerts)

如果您的日期字符串格式不一致,就像在您的JSON响应示例中一样,您可以通过执行split()来删除微秒部分:

from datetime import datetime

def convert(s):
    s = s.split('.')[0]
    return datetime.strptime(s, "%Y-%m-%d %H:%M:%S")

alerts = map(lambda x: dict(x, **{'alert_date': convert(x['alert_date'])}), alerts)

两个示例的结果 alerts 列表如下:

[{'alert_date': datetime.datetime(2014, 6, 5, 1, 0, 23),
  'key1': 'value11',
  'key2': 'value12',
  'key3': 'value13'},
 {'alert_date': datetime.datetime(2010, 12, 31, 0, 0),
  'key1': 'value21',
  'key2': 'value22',
  'key3': 'value23'}]

我喜欢你的方法,但我认为它有点相反。他们在字典上有一个日期对象,并希望将此日期对象转换为字符串。 - Guilherme
我建议使用isinstance()来检查值是否为日期对象,而不是将键名硬编码。 - Guilherme

0

最近我做了这样的事情

在我的情况下,字典可能有日期对象,也可能没有

而且我不知道日期/时间字段的键

def convert_date_on_dict(old_dict):
    new_dict = {}
    for k, v in old_dict.items():
        if isinstance(v, (date, datetime)):
            new_dict[k] = v.strftime('%Y-%m-%d')
        else:
            new_dict[k] = v

    return new_dict

所以...

for item in myDictList:
    new_item = convert_date_on_dict(item)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接