繁体   English   中英

ValueError: 时间数据与格式 '%Y-%m-%d %H:%M:%S.%f' 不匹配

[英]ValueError: time data does not match format '%Y-%m-%d %H:%M:%S.%f'

我正面临一个小问题。 我正在存储一些日期时间数据,数据是

# "datetime","numb","temperature"

"1998-04-18 16:48:36.76",0,38
"1998-04-18 16:48:36.8",1,42
"1998-04-18 16:48:36.88",2,23
"1998-04-18 16:48:36.92",3,24
"1998-04-18 16:48:36",4,42
"1998-04-18 16:48:37",5,33
"1998-04-18 16:48:37.08",6,25

日期时间列显然是字符串,所以当我尝试转换它时,我收到了这个错误

ValueError: time data '1998-04-18 16:48:36' does not match format '%Y-%m-%d %H:%M:
%S.%f'

我的代码是

import time
import datetime
import calendar

for k, line in enumerate(lines):
                if k > (int(header_line)):
                    data_pre = line.strip().split(',')
                    stDate = data_pre[0].replace("\"", "")
                    print stDate  # got 1998-04-18 16:48:36.76


                    dat_time = datetime.datetime.strptime(stDate,
                                                       '%Y-%m-%d %H:%M:%S.%f')
                    mic_sec = dat_time.microsecond
                    timcon = calendar.timegm(dat_time.timetuple())*1000000 + mic_sec
                    strDate = "\"" + strDate + "\""
                    print stDate # got "1998-04-18 16:48:36.76"

因为我的一些日期时间列缺少 .%f 值,所以我收到了这个错误。 我的文档可能包含几千个这样的日期时间值,所以我想出了将所有这些日期时间附加到 .0 的解决方案。 所以如果日期时间字符串是

"1998-04-18 16:48:36"

我的代码应该附加 .0 以满足格式标准。 例如

"1998-04-18 16:48:36.0"

我尝试将 .0 附加到 stDate,但出现此错误

AttributeError: 'str' object has no attribute 'append'

如果有人给我一个线索如何处理这样的问题。 任何帮助将不胜感激。

更新:我查看了您的代码并发现了一些错误类型。 此外,您似乎没有添加连接。

我已经把两者都整理好了。

错误类型:

你写了:

for k, line in enumerate(lines):
                if k > (int(header_line)):
                    data_pre = line.strip().split(',')
                    stDate = data_pre[0].replace("\"", "")
                    print stDate  # got 1998-04-18 16:48:36.76


                    dat_time = datetime.datetime.strptime(stDate,
                                                   '%Y-%m-%d %H:%M:%S.%f')
                    mic_sec = dat_time.microsecond
                    timcon = calendar.timegm(dat_time.timetuple())*1000000 + mic_sec

                    strDate = "\"" + strDate + "\""
                    # ^ This line is wrong
                    # It should say: 
                    # strDate = "\"" + stDate + "\""

                    print stDate # got "1998-04-18 16:48:36.76"
                    # ^ This line is wrong
                    # It should say:
                    # print strDate

实现上述更改,我们现在可以将“+”.0“”添加到您的代码示例中

(先尝试运行它,确保在继续之前了解它在做什么):

import time
import datetime
import calendar

A = "1998-04-18 16:48:36.76,0,38"
B = "1998-04-18 16:48:37,5,33"

# Run the Code for B

data_pre = B.strip().split(',')
print data_pre

stDate = data_pre[0].replace("\"", "")
print "stDate before: ", stDate  

### Addition of Addition of .0
# Here, we try to convert to datetime format using the format
# '%Y-%m-%d %H:%M:%S.%f'
try:
    dat_time = datetime.datetime.strptime(stDate,
                               '%Y-%m-%d %H:%M:%S.%f')

# If that doesn't work, we add ".4" to the end of stDate
# (You can change this to ".0")
# We then retry to convert stDate into datetime format                                   
except:
    stDate = stDate + ".4"
    dat_time = datetime.datetime.strptime(stDate,
                               '%Y-%m-%d %H:%M:%S.%f')
    print "stDate after: ", stDate

###                                
print "dat_time: ", dat_time

mic_sec = dat_time.microsecond
print "mic_sec: ", mic_sec

timcon = calendar.timegm(dat_time.timetuple())*1000000 + mic_sec
print "timecon: ", timcon

strDate = "\"" + stDate + "\""
print "strDate: ", strDate 

因此,例如:

A = "1998-04-18 16:48:36.76,0,38"
B = "1998-04-18 16:48:37,5,33"
# Note the difference  ^^

# Output for B:
['1998-04-18 16:48:37', '5', '33']
stDate before:  1998-04-18 16:48:37
stDate after:  1998-04-18 16:48:37.4
dat_time:  1998-04-18 16:48:37.400000
mic_sec:  400000
timecon:  892918117400000
strDate:  "1998-04-18 16:48:37.4"

# Output for A:
['1998-04-18 16:48:36.76', '0', '38']
stDate before:  1998-04-18 16:48:36.76
dat_time:  1998-04-18 16:48:36.760000
mic_sec:  760000
timecon:  892918116760000
strDate:  "1998-04-18 16:48:36.76"

将所有内容集成到您的主循环中。 这是您总体上想要的:

for k, line in enumerate(lines):
                if k > (int(header_line)):
                    data_pre = line.strip().split(',')
                    stDate = data_pre[0].replace("\"", "")
                    print stDate  

                    try:
                        dat_time = datetime.datetime.strptime(stDate,
                               '%Y-%m-%d %H:%M:%S.%f')                                  
                    except:
                        stDate = stDate + ".4"
                        dat_time = datetime.datetime.strptime(stDate,
                               '%Y-%m-%d %H:%M:%S.%f')

                    mic_sec = dat_time.microsecond
                    timcon = calendar.timegm(dat_time.timetuple())*1000000 + mic_sec

                    strDate = "\"" + stDate + "\""
                    # ^ Changed this line
                    print strDate 
                    # ^ Changed this line

原答案:

您不能附加到字符串。

一种选择是使用A + B

A = "1998-04-18 16:48:36"
B = ".0"
C = A + B
C = "1998-04-18 16:48:36.0"

您还可以使用str.join

D = "".join([A,B])
D = '1998-04-18 16:48:36.0'

有关更多信息,请参阅此问题的答案: 在 Python 中连接字符串的首选方法是哪种?

不要使用str函数格式化日期时间,而是尝试datetime.datetime.strftime函数:

不起作用的代码:

>>> import datetime
>>> import pytz
>>> jst = pytz.timezone('Asia/Tokyo')
>>> dt = jst.localize(datetime.datetime.now())
>>> dt
datetime.datetime(2018, 10, 11, 14, 42, 28, 557170, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> str(dt)
'2018-10-11 14:42:28.557170+09:00'
>>> dt_new = datetime.datetime.strptime(str(dt), '%Y-%m-%d %H:%M:%S.%f%z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '2018-10-11 14:42:28.557170+09:00' does not match format '%Y-%m-%d %H:%M:%S.%f%z'

有效的代码:

>>> import datetime
>>> import pytz
>>> jst = pytz.timezone('Asia/Tokyo')
>>> dt = jst.localize(datetime.datetime.now())
>>> dt
datetime.datetime(2018, 10, 11, 14, 42, 28, 557170, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> dt.strftime('%Y-%m-%d %H:%M:%S.%f%z')
'2018-10-11 14:42:28.557170+0900'
>>> dt_new = datetime.datetime.strptime(dt.strftime('%Y-%m-%d %H:%M:%S.%f%z'), '%Y-%m-%d %H:%M:%S.%f%z')
>>> dt_new
datetime.datetime(2018, 10, 11, 14, 42, 28, 557170, 
tzinfo=datetime.timezone(datetime.timedelta(0, 32400)))

所以在这里我使用 strftime 函数格式化日期时间并使用 strptime 函数解析格式化的日期时间,在两种情况下保持格式化程序相同。

无法解析具有时区信息并使用str(datetime)函数格式化的str(datetime)

假设我的数据框有两列,“日期”和“时间”。

将字符 '-' 替换为 '/' 或您计划实施的任何字符。单独添加此行为我修复了错误。

df.Date = df.Date.str.replace('-', '/')

在此处创建一个带有日期和时间的新列

df['DateTimeStart'] = df['Date'] + '-' + df['Time']

去掉所有的空白空间以防万一。

df.DateTimeStart = df.DateTimeStart.str.replace(' ', '')

现在将列格式化为日期时间格式

df['DateTimeStart'] = pd.to_datetime(df['DateTimeStart'], format='%d/%m/%Y-%H:%M:%S')
                 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM