【问题标题】:python: nested dictionary printing datetime as stringpython:嵌套字典将日期时间打印为字符串
【发布时间】:2017-03-09 02:51:53
【问题描述】:

this question有些相关

我有一本看起来像这样的字典

times = {
 'on': 
    {'start': datetime.time(6, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>), 
     'end': datetime.time(8, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)}
 'off':
    {'start': datetime.time(10, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>), 
     'end': datetime.time(13, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)}
}

打电话给str(times)

In[34]: str(f)
Out[34]: "{'on': {'start': datetime.time(6, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>), 'end': datetime.time(8, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)}, 'off': {'start': datetime.time(10, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>), 'end': datetime.time(13, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)}}"

当我希望日期时间输出为时

In[37]: str(times['on']['start'])
Out[37]: '06:00:00'

又名:

"{'on': {'start': '06:00:00, 'end': '08:00:00'}, 'off': {'start': '10:00:00', 'end': '13:00:00'}}"

有没有办法在不创建自定义函数的情况下做到这一点?

【问题讨论】:

    标签: python string dictionary


    【解决方案1】:

    这样就可以了:

    str({k: {k1: str(v1) for k1, v1 in v.items()} for k, v in times.items()})
    

    输出看起来像这样:

    "{'on': {'start': '10:01:00', 'end': '10:01:00'}, 'off': {'start': '10:01:00', 'end': '10:01:00'}}"
    

    这有点恶心,因为您基本上必须解包然后重新打包嵌套字典,但它确实有效。对于任意嵌套的数据,您需要一个自定义函数。

    【讨论】:

      【解决方案2】:

      您需要使用datetime.strftime(),格式字符串为:"%H:%M:%S"

      因此,为了更新您的字典,请执行以下操作:

      for key, nested_dict in times.items():
          for k in nested_dict:
              nested_dict[k] = nested_dict[k].strftime("%H:%M:%S")
      

      或者,使用dict理解作为:

      {key: {k: v.strftime("%H:%M:%S") for k, v in nested_dict.items()} 
            for key, nested_dict in times.items()}
      

      【讨论】:

        【解决方案3】:

        这更容易,适用于任意字典:

        import json
        
        times = { ... }
        s = json.dumps(times, default=str)
        print(s)
        

        【讨论】:

        • 呵呵,我从来不知道dumps(default=)
        【解决方案4】:

        这是一个子类控制时间对象的字符串输出的好案例:

        你可以这样做:

        class MyTime(datetime.time):   
            def __repr__(self):
                return datetime.time.strftime(self, "%H:%M:%S")    
        
        
        times = {
             'on': 
                {'start': MyTime(6, 0), 
                 'end': MyTime(8, 0)},
             'off':
                {'start': MyTime(10, 0), 
                 'end': MyTime(13, 0)}
            }
        

        那么格式化是自动的:

        >>> times
        {'on': {'start': 06:00:00, 'end': 08:00:00}, 'off': {'start': 10:00:00, 'end': 13:00:00}}
        

        然而嵌套字典的元素仍然是时间对象:

        >>> times['on']['start'].hour
        6
        

        【讨论】:

          猜你喜欢
          • 2016-08-13
          • 2018-09-24
          • 2019-09-30
          • 1970-01-01
          • 2020-10-09
          • 2015-03-24
          • 2016-10-21
          • 1970-01-01
          相关资源
          最近更新 更多