2016-04-24 12 views
1

pyodbcを使用してSQLサーバからデータを取得していて、別のデータベース(テーブル)に挿入する前にdatetime.datetimeカラムの値をepochに変換します。私がそれをしているとき、私のリストのリストが平らになっているのが分かります。これを避ける方法。Python list comprehensionがリストを平滑化しています

>>> scur.execute("select top 2 * from database.dbo.table") 
<pyodbc.Cursor object at 0x1f2d930> 
>>> cnt = scur.fetchall() 
>>> rowlist = [list(l) for l in cnt] 

>>> rowlist 

[[404458, 348, datetime.datetime(2015, 10, 9, 14, 13), datetime.datetime(2015, 10, 9, 0, 0), u'ded1598f-eed1-4edb-bfe4-f866592e9a51', u'el ong', u'', 1, 0, 0.091499999999999998, 0.0, -999999.0, -999999.0, 0.0, 0.25, -999999.0, -999999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, None, None, 1127, None, u'150610007', u'10', u'CMMQ0056', None, u'0', None, None, None, None, None, False, None, None], [404459, 349, datetime.datetime(2015, 10, 9, 14, 13), datetime.datetime(2015, 10, 9, 0, 0), u'174b2d32-e71d-40b0-9c1d-cab7274c9b40', u'el ong', u'', 1, 0, 0.055399999999999998, 0.0, -999999.0, -999999.0, 0.0, 0.40000000000000002, -999999.0, -999999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, None, None, 1127, None, u'150610007', u'10', u'CMMQ0056', None, u'0', None, None, None, None, None, False, None, None]] 

>>> [row[i].strftime('%s') if isinstance(row[i], datetime.date) else row[i] for row in rowlist for i in range(len(row))] 

[404458, 348, '1444414380', '1444363200', u'ded1598f-eed1-4edb-bfe4-f866592e9a51', u'el ong', u'', 1, 0, 0.091499999999999998, 0.0, -999999.0, -999999.0, 0.0, 0.25, -999999.0, -999999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, None, None, 1127, None, u'150610007', u'10', u'CMMQ0056', None, u'0', None, None, None, None, None, False, None, None, 404459, 349, '1444414380', '1444363200', u'174b2d32-e71d-40b0-9c1d-cab7274c9b40', u'el ong', u'', 1, 0, 0.055399999999999998, 0.0, -999999.0, -999999.0, 0.0, 0.40000000000000002, -999999.0, -999999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, None, None, 1127, None, u'150610007', u'10', u'CMMQ0056', None, u'0', None, None, None, None, None, False, None, None] 

答えて

0

をあなたが行を保つように、内側のリストカンプを使用して反復する必要がある、あなたはまた、単に範囲を必要とせずに、各行の要素を反復処理することができます。

[int(ele.strftime("%s")) if isinstance(ele, datetime.datetime) else ele for ele in sub] for sub in l] 
0

あなたはリストのリスト(あなたの単純な例を)持っていると仮定します。

>>> LoL=[[datetime.datetime(2015, 10, 9, 14, 13),'a','b', 1,2], [datetime.datetime(2016, 11, 9, 14, 13),'c','d', 3,4]] 

あなたはその後、ネストされたリストを維持するために、ネストされたリストの理解を持つことができます。

>>> [[e.strftime('%s') if isinstance(e, datetime.date) else e for e in rowlist] for rowlist in LoL] 
[['1444425180', 'a', 'b', 1, 2], ['1478729580', 'c', 'd', 3, 4]] 
+0

しかし、私の問題は解決しません。 "datetime.datetime(2015,10、9,14,13)"を "1444414380"に変換します。私はここで何かを逃しています。 – ThirdEye

0

これはそれを行う必要があります。まだ変換を実行しながら、これが希望リスト構造を保持します:

[[v.strftime('%s') if isinstance(v, datetime.date) else v for v in row] for row in rowlist] 
関連する問題