如何使用 PyYAML 创建日期时间对象

Posted

技术标签:

【中文标题】如何使用 PyYAML 创建日期时间对象【英文标题】:How to create a datetime object with PyYAML 【发布时间】:2011-05-11 04:20:06 【问题描述】:

我希望能够使用datetime.datetime.now() PyYAML 创建一个日期时间对象。调用一些函数很容易:

>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
'description': 'Something', 'ts': 1289955567.940973
>>> 

但是,我似乎不知道如何获得datetime.now()。我已经尝试使用各种python yaml tags 调用尽可能多的排列。

这些都失败了:

tests = [ 
        'dt: !!python/object:datetime.datetime.now []',
        'dt: !!python/object/new:datetime.datetime.now []',
        'dt: !!python/object/apply:datetime.datetime.now []',
]

for y in tests:
    try:
        print yaml.load(y)
    except Exception, err:
        print '==>', err

【问题讨论】:

【参考方案1】:

我认为这个例子达到了你想要的效果:

dt = yaml.load("""dt: !!python/object/apply:apply
    - !!python/object/apply:getattr
        - !!python/name:datetime.datetime
        - now
    - []
""")

但是,我认为它太牵强了,因为 PyYAML 支持的 !!python/object 语法不应该调用类方法(datetime.datetime.now 实际上就像 datetime 对象的“静态”工厂方法)。正如你所说,这更简单(虽然不是你要找的):

dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")

另一种可能的解决方法是创建一个自定义帮助函数来包装对datetime.datetime.now 的调用,以便使用!!python/object/apply 轻松对其进行序列化。缺点是这种序列化不能移植到没有找到这个自定义函数的环境中。

无论如何,在我看来,序列化始终返回当前日期时间(实际上是解析 YAML 的时间)的值并没有太大意义。 PyYAML 为序列化某个时间戳提供了这种快捷方式:

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")

【讨论】:

非常好。我同意这是一个有点复杂的用例,但您的解决方案看起来是最简单的方法。对于上下文,我正在研究使用 YAML 生成将通过 Django 加载的测试数据。在加载文件时生成数据对于许多测试来说是一个巨大的好处。感谢您的回答! fwiw,在 python 3 中删除了apply,该示例不再有效。也就是说,我实际上并不想这样做,只是在做一些研究时偶然发现了这个答案:)(哇pyyaml 太疯狂了!) !!timestamp 是我要找的,太好了! :)

以上是关于如何使用 PyYAML 创建日期时间对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Pandas 的情况下创建等效于 numpy.nan 的日期时间对象?

如何创建代表下一个指定日期时间的完整 NSDate 对象?

如何在javascript中从字符串创建日期对象[重复]

如何从按对象创建日期排序的核心数据中获取结果?

禁用 PyYAML 值转换

如何将日期字符串转换为日期或日历对象?