2016-11-14 60 views
2

我正在使用python 3.5.2,pandas 0.18.1和sqlite3。將UNIX時間戳轉換爲系列的pandas.tslib.Timestamp和datetime

以我的數據的基礎上,我有一個柱unix_timeINT爲自1970年以來理想我想讀從源碼我的數據幀秒,然後創建一個time柱,其將對應於datetimepandas.tslib.Timestamp轉換unix_time柱的我只能用於某些處理,然後在保存數據幀之前丟棄它。

的問題是,當解析使用unix_time柱:

df = pd.read_from_sql_query("SELECT * FROM test", con, parse_dates=['unix_time']) 

我獲得pandas.tslib.Timestamp類型是罰款,我的處理,但後來我不得不使用重建我原來unix_time柱:

df['unix_time'][i] = (df['unix_time'][i] - datetime(1970,1,1)).total_seconds() 

這真的很髒'

第一個問題:你有更好的方法嗎?

我想過放棄UNIX時間格式,只使用datetime格式,但實際上pandas.tslib.Timestamp大熊貓返回to_datetime方法......不管怎樣,這樣做會迫使我遍歷所有行這是一個壞的解決方案。 (這是不可能在數據幀的單細胞上不是視圖別的什麼應用to_datetime

第二個問題:是否有可能應用在一個系列

我最後的嘗試是直接使用? 。df['time'] = datetime.datetime.fromtimestamp(df['unix_time'])但出人意料的是,它也返回pandas.tslib.Timestamp

最後,知道我只能保存UNIX時間戳或日期時間,我只能選擇暫時是:

  • 解析但不得不將其轉換回unix時間戳一個由 一個。

  • 或不解析它,但必須逐個將它們轉換爲pandas.tslib.Timestamp

如果我可以轉換整個系列,那將會很棒。

最後一個問題:有沒有一種方法來轉換一個UNIX時間戳系列datetime(或至少pandas.tslib.Timestamp),或pandas.tslib.Timestamp(或datetime)系列UNIX時間戳?

感謝

編輯: 在我處理,我解壓,我要追加到我的數據集的行。顯然,丁文到pandas.tslib.Timestamp從數據幀傳遞到意甲時追加含蓄:

df = pd.DataFrame({'UNX':pd.date_range('2016-01-01', freq='9999S', periods=10).astype(np.int64)//10**9}) 
df['Date'] = pd.to_datetime(df.UNX, unit='s') 
print(df.Date.dtypes) 
print(type(df['Date'][0])) 
test = df.iloc[0] 
print(type(test.Date)) 
new_df = test.to_frame().transpose() #from here, impossible to do : new_df.to_sql("test", con) because the type for 'Date' is not supported 
print(new_df.Date.dtypes) 

回報

datetime64[ns] 
<class 'pandas.tslib.Timestamp'> 
<class 'pandas.tslib.Timestamp'> 
object 

有沒有辦法在new_df「日期」從pandas.tslib.Timestamp轉換爲datetime64[ns]datetime.datetime(或簡單地str)?

回答

2

IIUC你能做到這樣:

In [96]: df = pd.DataFrame({'UNX':pd.date_range('2016-01-01', freq='9999S', periods=10).astype(np.int64)//10**9}) 

In [97]: df 
Out[97]: 
      UNX 
0 1451606400 
1 1451616399 
2 1451626398 
3 1451636397 
4 1451646396 
5 1451656395 
6 1451666394 
7 1451676393 
8 1451686392 
9 1451696391 

轉換UNIX紀元到Python日期時間:

In [98]: df['Date'] = pd.to_datetime(df.UNX, unit='s') 

In [99]: df 
Out[99]: 
      UNX    Date 
0 1451606400 2016-01-01 00:00:00 
1 1451616399 2016-01-01 02:46:39 
2 1451626398 2016-01-01 05:33:18 
3 1451636397 2016-01-01 08:19:57 
4 1451646396 2016-01-01 11:06:36 
5 1451656395 2016-01-01 13:53:15 
6 1451666394 2016-01-01 16:39:54 
7 1451676393 2016-01-01 19:26:33 
8 1451686392 2016-01-01 22:13:12 
9 1451696391 2016-01-02 00:59:51 

轉換datetime到UNIX紀元:

In [100]: df['UNX2'] = df.Date.astype('int64')//10**9 

In [101]: df 
Out[101]: 
      UNX    Date  UNX2 
0 1451606400 2016-01-01 00:00:00 1451606400 
1 1451616399 2016-01-01 02:46:39 1451616399 
2 1451626398 2016-01-01 05:33:18 1451626398 
3 1451636397 2016-01-01 08:19:57 1451636397 
4 1451646396 2016-01-01 11:06:36 1451646396 
5 1451656395 2016-01-01 13:53:15 1451656395 
6 1451666394 2016-01-01 16:39:54 1451666394 
7 1451676393 2016-01-01 19:26:33 1451676393 
8 1451686392 2016-01-01 22:13:12 1451686392 
9 1451696391 2016-01-02 00:59:51 1451696391 

檢查:

In [102]: df.UNX.eq(df.UNX2).all() 
Out[102]: True 
+0

感謝您的澄清,它幫助我更準確地看到我遇到的問題。事實上,使用這種方式一切正常。我將編輯我的問題,以顯示類型混亂的地方。 – amougel