【问题标题】:Convert datetime in Python string variable to proper format将 Python 字符串变量中的日期时间转换为正确的格式
【发布时间】:2016-02-28 21:30:25
【问题描述】:

我是 Python 编程的新手。 我正在尝试使用 python 将 YAML 文件转换为 JSON 文件。 我正在使用 pyyaml 包进行转换。 在 YAML 文件中,有一些日期值在 Python 中被转换为 Datetime 对象。我需要将它们按原样转换或转换为字符串。

YAML 文件示例: http://pastebin.com/sdcx6sEJ

输出字符串: http://pastebin.com/Bvm5cNwH

输出: {"meta": {"data_version": 0.6, "created": datetime.date(2013, 2, 22), "revision":1}

预期: {"meta": {"data_version": 0.6, "created": "2013-02-22", "revision":1}

sourcedir = "D:/YAML/"
targetdir = "D:/JSON/"
for subdir, dirs, files in os.walk(sourcedir):
    for file in files:
        # print os.path.join(subdir, file)
        filepath = subdir + file
        if filepath.endswith(".yaml"):
            with open(filepath, 'r') as src:
                try:
                    JSONfile = targetdir + file.replace("yaml", "json")
                    currentfile = open(JSONfile, 'w')
                    ymldata = yaml.load(src)
                    # print(ymldata)
                    ymldata = str(ymldata)
                    ymldata = ymldata.replace("'", "\"")
                    # ymldata = ymldata.replace("datetime.date(2005, 6, 13)", "\"2005-06-13\"")
                    print(ymldata)
                    json.loads(ymldata)
                    # jsondata = json.dumps(ymldata)
                    # jsonSTR = str(jsondata)
                    # currentfile.write(jsonSTR)
                except ValueError as exc:
                    print(exc)

【问题讨论】:

    标签: python json datetime


    【解决方案1】:
    In [1]: datetime.date(2013, 2, 22).isoformat()
    Out[1]: '2013-02-22'
    

    或者使用手动格式化来获取它:

    In [1]: datetime.date(2013, 2, 22).strftime('%Y-%m-%d')
    Out[1]: '2013-02-22'
    
    In [2]: datetime.date(2013, 2, 22).strftime('%Y/%m/%d')
    Out[2]: '2013/02/22'
    

    【讨论】:

    • 我在字符串中得到文本“datetime...”,而不是对象本身。更新了问题以包含代码。
    • 在您的示例输出中,它不是字符串中的日期时间,而是实际对象...?
    • 更新了问题以包含示例数据。
    • 我正在查看您的文件和您的示例,两者都有一个 datetime 对象{"meta": {"data_version": 0.6, "created": datetime.date(2013, 2, 22), "revision":1}
    【解决方案2】:

    把它放在你最里面的 try/except 块中(在 json.loads() 之前):

    ymldata['meta']['created'] = ymldata['meta']['created'].strftime('%Y-%m-%d')
    

    【讨论】:

      【解决方案3】:

      我认为调用 pyyaml.safe_load() 会阻止创建复杂对象。所以这可能对你有用。

      【讨论】:

      • 我没有按原样的日期时间对象,它嵌入在字符串中。更新问题以包含代码。 TIA。
      • 谢谢你,林肯。我检查了 safe_load() 并仍然在字符串中获得相同的日期时间对象。
      • 我能想到的唯一另一件事是从 yaml 文件中删除 !!timestamp 标记
      猜你喜欢
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2023-03-08
      • 2014-08-10
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多