strptime无法用于以下格式

时间:2018-06-20 20:10:56

标签: python strptime

我使用了从日志文件中读取的以下格式,使用的格式化程序与DateTime格式匹配。不知道为什么它仍然错误。  -ValueError:时间数据“'2018-01-01 10:00:00'”与格式'%Y-%m-%d%H:%M:%S'不匹配

f = open("log.txt", 'w')
f.write("UID, SID, LogTime\n")
f.write("1, 1, '2018-01-01 10:00:00'\n")
f.write("1, 1, '2018-01-01 10:30:00'\n")
f.write("1, 1, '2018-01-01 11:30:00'\n")
f.close()
x = open("log.txt", 'r')

print (x.read())
x.close()

import numpy as np 
from datetime import datetime
a = open("log.txt", 'r+')
temp = None
header = a.readline()
for line in a:
    line = line.strip()
    columns = line.split(',')
    print (columns)
    UID = columns[0]
    SID = columns[1]
    print (columns[2])
    LogTime = datetime.strptime(columns[2],"%Y-%m-%d %H:%M:%S")
    a.write(','+LogTime-temp)
    temp = LogTime

3 个答案:

答案 0 :(得分:3)

问题是您的格式在日期时间前后都加上了引号,并加上前导空格:

f.write("1, 1, '2018-01-01 10:00:00'\n")

但是您的解析器不会删除那些引号和空格,并且您的strptime不会期望它们。而且,尽管2018-01-01 10:00:00与您的格式匹配,但'2018-01-01 10:00:00'与您的格式不匹配。

您可以通过以下几种方法解决此问题:

  • 使用csv模块进行读取(或numpy,因为您已经导入了该模块),它将自动处理CSV引用和空格。
  • 手动进行报价处理,例如timestamp = columns[2].strip().strip("'")
  • strptime格式添加空格和引号:datetime.strptime(columns[2]," '%Y-%m-%d %H:%M:%S'")

第一个似乎是最干净的,但是它们都可以工作。


当然,一旦解决,就会出现另一个问题:a.write(','+LogTime-temp)试图将字符串','添加到datetime对象中,然后减去{{1 }}从结果中。这些类型都不兼容,所以这没有道理。

如果您以后尝试比较,那么您必须:

  • 请特别处理第一行,因为它没有上次的时间;
  • 还特别处理第一个 diff ,因为它没有前面的None;
  • 减去时间以获得, ,然后尝试将其中一个附加到字符串上或者使用timedelta将diff转换为字符串,而不是仅将其添加到str,或者最好使用f字符串(或',')而不是添加字符串。

这应该足以让您入门,但这还不是完整的程序:

format

然后,您在尝试读取文件的同时尝试将其写入文件,这只会造成一团糟。您将阅读一行,然后覆盖下一行,或者更有可能覆盖下一行的一半,或者接下来的两三行,或者其他任何内容,然后再阅读下一行……您要做的是的:

  • 写入一个不同的文件(如果需要,您可以在原始文件上temp = None for line in a: # ... up to LogTime = ... if temp is not None: diff = LogTime - temp print(diff) temp = LogTime 对其进行{
  • 只需将要写入的行构建到列表中,然后os.replace文件,重新close相同的文件,然后写出行列表。

答案 1 :(得分:0)

您正在读取此值“'2018-01-01 11:30:00'”,而不是此“ 2018-01-01 11:30:00”

只需尝试

LogTime = datetime.strptime(columns[2].strip(" '"),"%Y-%m-%d %H:%M:%S")

答案 2 :(得分:0)

您的数据似乎包含引号,因此变量中有“'2018-01-01 11:30:00'”,而不是“ 2018-01-01 11:30:00”。

您可以通过多种方式删除这些内容,以下是一些想法:

`/` is not writable.
Bundler will use `/tmp/bundler/home/unknown' as your home directory temporarily.
Fetching gem metadata from https://rubygems.org/...........
Fetching gem metadata from https://rubygems.org/.

Resolving dependencies.............
Fetching rake 10.3.2

Retrying download gem from https://rubygems.org/ due to error (2/4): Errno::ENOENT No such file or directory @ rb_sysopen - /.gem/ruby/2.4.0/cache/rake-10.3.2.gem
Retrying download gem from https://rubygems.org/ due to error (3/4): Errno::ENOENT No such file or directory @ rb_sysopen - /.gem/ruby/2.4.0/cache/rake-10.3.2.gem
Retrying download gem from https://rubygems.org/ due to error (4/4): Errno::ENOENT No such file or directory @ rb_sysopen - /.gem/ruby/2.4.0/cache/rake-10.3.2.gem
Errno::ENOENT: No such file or directory @ rb_sysopen -
/.gem/ruby/2.4.0/cache/rake-10.3.2.gem
An error occurred while installing rake (10.3.2), and Bundler cannot continue.
Make sure that `gem install rake -v '10.3.2'` succeeds before bundling.

In Gemfile:
  aws_account_utils was resolved to 0.1.4, which depends on
  rake

或使用csv模块