我正面临一个小问题。我正在存储一些日期时间数据,数据是
# "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以满足格式标准。 e.g
"1998-04-18 16:48:36.0"
我尝试将.0附加到stDate,但是我收到此错误
AttributeError: 'str' object has no attribute 'append'
如果有人给我一个线索如何处理这样的问题。任何帮助将不胜感激。
答案 0 :(得分:5)
更新:我查看了您的代码并发现了一些错误类型。 此外,看起来你没有添加连接。
我已将它们分类了。
您写道:
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
(首先尝试运行,确保在继续之前了解它的作用):
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'
有关详细信息,请参阅此问题的答案:Which is the preferred way to concatenate a string in Python?
答案 1 :(得分:1)
请尝试使用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)
函数格式化的日期时间。
答案 2 :(得分:1)
假设我的数据框有两列,“日期”和“时间”。
将字符 '-' 替换为 '/' 或您计划实现的任何字符。单独添加这一行为我修复了错误。
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')