我有一个来自API的直接CSV流,该API正在使用以下代码将数据推送到数据库中:
def loadData(data, engine) :
stream = data.content
try:
df = pd.read_csv(io.StringIO(stream.decode('utf-8')))
df['Snapshot'] = datetime.datetime.now()
if file.split(".")[0] == "SIM_SDS" :
df.to_sql(file.split(".")[0], engine, if_exists='append', index=False, infer_datetime_format = True)
else :
df.to_sql(file.split(".")[0], engine, if_exists='replace', index=False, infer_datetime_format = True)
except:
print('Loading data to the database failed for ' + file)
我遇到的问题是传入的日期时间格式是YYYY-MM-DDTHH:MM:SS.SSSZ(例如,2017年10月30日T20:26:22.731Z)
我发现了很多不同的版本,其中只有一个T或带有+0300的T,但是我还没有找到这种特殊的格式,我似乎无法将其解析为日期时间。挑战的另一部分是,日期时间字段在每种情况下都不相同,因此我还必须有一种将这种格式识别为日期时间的方法。
由于字段以文本形式显示,因此在数据库中创建表时会产生问题。当这些在Tableau中用于datediff类型的工作时,会导致问题。
尝试1:
dateCol = [col for col in df.columns if 'Date' in col]
for col in dateCol:
df[col] = df[col].map(lambda x: x.strip('T').strip('Z'))
print(df[col])
我认为这失败了,因为NaN问题,该字段中没有日期。
答案 0 :(得分:0)
使其可与以下各项一起使用:
def loadData(data, engine) :
stream = data.content
try:
df = pd.read_csv(io.StringIO(stream.decode('utf-8')))
df['Snapshot'] = datetime.datetime.now()
df.where(df.notnull(),None)
dateCol = [col for col in df.columns if 'Date' in col]
for col in dateCol:
df[col] = pd.to_datetime(df[col])
if file.split(".")[0] == "SIM_SDS" :
df.to_sql(file.split(".")[0], engine, if_exists='append', index=False)
else :
df.to_sql(file.split(".")[0], engine, if_exists='replace', index=False)
except:
print('Loading data to the database failed for ' + file)
这将导致表格字段的正确格式,我确定应该将datetimes设置为datetimes。
请随时给我一些改进的建议。