2016-11-14 16 views
2

私はpython 3.5.2、pandas 0.18.1、sqlite3を使っています。私のデータベースでUNIXタイムスタンプをpandas.tslib.Timestampとシリーズの日時を変換する

1970は、理想的には私はsqliteのから私のデータフレームを読み、[unix_time列のdatetimeまたはpandas.tslib.Timestamp変換に対応するtime列を作成するために、私は秒間INTでカラムunix_timeを持っています私はいくつかの処理にしか使用せず、データフレームを保存する前にドロップします。

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

私は私の処理のための罰金ですpandas.tslib.Timestamp種類を取得、その後私は使用して私の元unix_time列を再作成する必要があります:

問題が使っunix_time列をを解析するときということです

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

実際に「汚れている」

最初の質問:より良い方法がありますか?

私はUNIXの時刻形式を放棄し、事実のみpandas.tslib.Timestampでパンダのリターンからdatetimeフォーマットが、to_datetimeメソッドを使用して...とにかく、そうすることが悪いソリューションであるすべての行を反復処理するために私を強制する考えました。私の最後の試みを直接使用していた、それはシリーズでそれを適用することが可能である

:?(データフレーム

2番目の質問の単一セルの景色よりも、何か他のものにto_datetimeを適用することは不可能です。df['time'] = datetime.datetime.fromtimestamp(df['unix_time'])しかし驚くべきことに、それはまたpandas.tslib.Timestampを返し

を最後に、私は唯一のUNIXタイムスタンプまたは日付時刻を保存することができますことを知って、今のところ私の唯一の選択肢は次のとおりです。

  • を解析してから、それをunixタイムスタンプに戻す必要があります。 です。

  • または解析しないでください。 を順番に変換する必要があります。

シリーズ全体を変換できれば素晴らしいと思います。

最後の質問:UNIXタイムスタンプにdatetime(または少なくともpandas.tslib.Timestamp)にUNIXタイムスタンプシリーズを変換する方法、またはpandas.tslib.Timestamp(またはdatetime)シリーズがありますか?

おかげ

EDIT:私の処理中に、私は私が私のデータセットに追加したい行を抽出 。セリエへのデータフレームから渡すときどうやら、pandas.tslib.Timestampにcoversionは、暗黙のうちに追加されます

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 

datetime64[ns]またはdatetime.datetimepandas.tslib.Timestampからnew_dfで「日付」を変換する方法はあります(または単純に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 

は、PythonのdatetimeにUNIXエポックを変換します

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 

UNIXエポックにdatetimeを変換します

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

関連する問題