【问题标题】:Getting datetime object to print as a real date获取日期时间对象以打印为真实日期
【发布时间】:2019-09-16 16:49:46
【问题描述】:


我有一个带有这样行的文本文件..

(datetime.datetime(2017, 1, 1, 4, 16), 0.17799999999999999)
(datetime.datetime(2017, 1, 1, 4, 26), 0.20000000000000001)
(datetime.datetime(2017, 1, 1, 4, 36), 0.17699999999999999)

最终我想读入数据并根据值绘制日期,但我目前坚持只读取数据。

目前为止

f=open('data.txt', 'r')
for line in f:
    line = line.strip()
    columns = line.rsplit(',',1)                                                                                                                             
    date=columns[0][1:]
    print(date)

示例输出:

datetime.datetime(2017, 1, 1, 4, 36)

但我希望它打印为日期,例如20170101 04:36:00(或类似)
我不知道如何让 datetime 对象得到这样的识别,并显示为真实的日期字符串。如果我用谷歌搜索它,我会看到大量关于将字符串转换为日期时间对象的信息,但反之则没有。

非常感谢。

【问题讨论】:

  • 所以你的文件实际上有原始的 datetetime 对象保存为一个字符串,如(datetime.datetime(2017, 1, 1, 4, 16), 0.17799999999999999)
  • 是的,没错。它以这种方式从数据库中提取。 (我正在努力格式化这些 cmets!)
  • 为什么要从数据库中提取数据并将其保存到 txt 文件中?而不是直接拉出这些并处理它们?
  • 我们必须将数据库交互保持在最低限度,所以我只想将所有数据提取到一个转储中,然后不必再次接触数据库。
  • 你是如何从数据中提取并推送到 txt 的,你知道你可以将 datetime 对象保存为字符串吗?

标签: python


【解决方案1】:

示例中文本文件的内容是有效的 Python 语法,因此如果您确定此格式正确,并且数据在您自己的控制之下,您可以只评估这些行。 (请注意,如果数据可以被其他人操纵,这会带来安全风险,因此这可能是也可能不是一个好的解决方案,具体取决于您的用例。

import datetime

with open('data.txt', 'r') as file:  # Tip: use context manager to avoid resource leak
    for line in file:
        line = line.strip()
        date = eval(line)[0]  # evaluate line as Python code and get first element
        print(date.strftime('%Y%m%d %H%M'))  # print date/time in preferred format

【讨论】:

  • 我正在写完全相同的答案,并想知道为什么其他人不只是 eval() 字符串。 :-)
【解决方案2】:

您可以使用正则表达式从字符串的日期时间部分提取整数,并使用它们创建一个日期时间对象。然后,您可以随意操作日期时间对象以打印所需的输出:

import re
from datetime import datetime

regex_match = re.match(r'.*?(\d+), (\d+), (\d+), (\d+), (\d+).*', 'datetime.datetime(2017, 1, 1, 4, 36)').groups()
d = datetime(*[int(i) for i in regex_match])

然后您可以选择如何打印:

>> d = datetime(2017, 1, 1, 4, 16)
>> print(d.isoformat())
.. 2017-01-01T04:16:00

或者对打印有更多的控制:

>> d.strftime("%Y%m%d %H:%M:%S")
.. '20170101 04:16:00'

所以在你的代码中是:

f=open('data.txt', 'r')
for line in f:
    line = line.strip()
    columns = line.rsplit(',',1)                                                                                                                             
    date=columns[0][1:]
    regex_match = re.match(r'.*?(\d+), (\d+), (\d+), (\d+), (\d+).*', date).groups()
    d = datetime(*[int(i) for i in regex_match])
    print(d.strftime("%Y%m%d %H:%M:%S"))

一旦你有了 datetime 对象,你还可以使用 matplotlib(你引用想要绘制这个)将 datetime 对象转换为可读字符串(参考:Plotting dates on the x-axis with Python's matplotlib):

import matplotlib.pyplot as plt
your_datetime_array = [(datetime.datetime(2017, 1, 1, 4, 16), 0.17799999999999999),
(datetime.datetime(2017, 1, 1, 4, 26), 0.20000000000000001),
(datetime.datetime(2017, 1, 1, 4, 36), 0.17699999999999999)]

x = [tup[0] for tup in your_datetime_array]
y = [tup[1] for tup in your_datetime_array]

plt.xticks(rotation=-45) # rotate them if you want
ax = plt.gca()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))

plt.plot(x, y)
plt.show()

请注意,更改 '%Y-%m-%d %H:%M' 字符串将更改绘制的格式。

【讨论】:

  • 谢谢,我试了一下。现在我收到错误 AttributeError: 'str' object has no attribute 'strftime'
  • 你肯定有这行:d = datetime.datetime(*[int(i) for i in regex_match])d.strftime("%Y%m%d %H:%M:%S") 之前?请注意原始代码中的“d”而不是“日期”。 "date" 是一个字符串对象,但 "d" 是 datetime 类型。
  • 我第一次没有,但现在我已经按照您的建议获得了所有内容。现在的错误有点不同。它说 AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
  • 您的文件顶部是否有:import datetime?还要确保你没有调用任何其他变量datetime
  • 我只是按照您的建议进行了尝试,并且只进行了“导入日期时间”。它有效!非常感谢!
【解决方案3】:

evalregex 的替代方案可以是 parse 模块:

import parse
import datetime as dt

f = open('mytext.txt', 'r')
template = "(datetime.datetime({Y}, {m}, {d}, {H}, {M}), {v})"
for line in f:
    x = parse.parse(template, line).named
    Y, m, d, H, M = int(x["Y"]), int(x["m"]), int(x["d"]), int(x["H"]), int(x["M"])
    ts = dt.datetime(Y, m, d, H, M)
    print(ts.strftime("%Y%m%d %H:%M:00"))
f.close()

输出:

20170101 04:16:00
20170101 04:26:00
20170101 04:36:00

【讨论】:

    【解决方案4】:

    你可以试试这个:

    import datetime
    import dateutil.parser 
    date = '2014-12-18T19:00:00-07:00'
     datetime_obj=dateutil.parser.parse(date)                                               
     print (date.strftime("%Y-%m-%d %H:%M:%S"))
    

    【讨论】:

    • 我不确定这如何应用于已经是日期时间对象格式的字符串。虽然显然不是真正的日期时间对象。
    【解决方案5】:

    让我们让事情变得更简单。
    datetime 模块中有两个简单且非常有用的功能,即。

    strftimestrptime

    • strftime 是“字符串格式化时间”。这意味着它将 DateTime 对象转换为字符串。

    • strptime 是“字符串解析时间”。这意味着它将日期字符串(以某种特定格式)转换为 DateTime 对象。

    让我举个例子:


    from datetime import datetime
    d = datetime.now()
    d
    

    datetime.datetime(2019, 4, 27, 17, 55, 9, 967025)

    将日期时间对象转换为格式为“YYYY-mm-dd”的字符串

    str_format_date = d.strftime("%Y-%m-%d")
    str_format_date
    

    '2019-04-27'

    将字符串(“YYYY-mm-dd”)转换回日期时间对象

    datetime.strptime(str_format_date, "%Y-%m-%d")
    

    datetime.datetime(2019, 4, 27, 0, 0)

    注意:时间发生了变化,因为我们将 datetime 对象转换为只是一个日期字符串(丢失了时间部分),然后将该日期字符串重新转换回日期时间对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多