【问题标题】:Python: Convert Dictionary of String Times to Date TimesPython:将字符串时间字典转换为日期时间
【发布时间】:2016-08-13 17:25:35
【问题描述】:

我有一本字典 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": [
    {
      "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",
    }
]}

【问题讨论】:

  • 请同时发布警报变量的确切内容。您可以替换这些值,但我需要了解它真正包含的内容
  • @Apero 我没有说这是字典列表。问题已更新。谢谢!

标签: python django string dictionary time


【解决方案1】:

编辑: 现在您已经添加了一些示例 json 响应数据,我知道这个答案是正确的,alertsIS 是一个字典列表

根据你的例子,我现在假设:

  • alertsalert 字典的列表
  • 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:,但除此之外它起作用了。谢谢!
  • 正如@Kasramvd 提到的,我的 strptime 示例需要一种特定的格式。这在我的示例数据(“2014-06-05 01:00:23.633000”)中没有得到满足。我还必须将数据源切换到具有一致时间格式的数据源才能正常工作。
  • 是的,数据源的完整性和一致性是最重要的。你当然可以在这个循环中放一个 try / except。
  • 你也可以使用这个dateutil.readthedocs.org/en/latest/parser.html。请小心并设置 dayfirst 或 yearfirst 选项
【解决方案2】:

您可以使用字典理解:

new_dict = {datetime.strptime(key, "%Y-%m-%d %H:%M:%S"): val for key, val in alerts['alert_date'].items()}

还要注意,由于您使用的是具有指定格式的datetime.strptime,它可能会引发ValueError。在这种情况下,dict-comprehension 将无济于事。因此,如果您不确定日期的 fromat,则需要处理异常:

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

【讨论】:

    【解决方案3】:

    最近我做了这样的事情

    就我而言,字典可能有日期对象,也可能没有

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

    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)
    

    【讨论】:

      【解决方案4】:

      如果我理解正确,您只想更改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'}]
      

      【讨论】:

      • 我喜欢你的方法,但我认为它有点相反。他们在字典上有一个日期对象,并希望将此日期对象转换为字符串
      • 我建议使用 isinstance() 检查值是否是日期对象,而不是硬编码键名
      猜你喜欢
      • 2015-03-24
      • 2021-06-01
      • 2015-09-17
      • 2022-08-18
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多