web-dev-qa-db-ja.com

時刻オブジェクトをpython pandas

Dtype objectを持つ列名DateTimeのデータセットがあります。

df['DateTime'] = pd.to_datetime(df['DateTime'])

上記のコードを使用してdatetime形式に変換し、列を分割してDateTimeを別々に設定しました

df['date'] = df['DateTime'].dt.date
df['time'] = df['DateTime'].dt.time

ただし、分割後、形式はオブジェクトタイプに変更され、日時に変換しているときに、time列名のエラーが次のように表示されます:TypeError:日時に変換できません

日時形式に変換する方法time

3
Nadeem Haque

combineを使用して、リスト内包表記で Zip を使用できます。

df = pd.DataFrame({'DateTime': ['2011-01-01 12:48:20', '2014-01-01 12:30:45']})
df['DateTime'] = pd.to_datetime(df['DateTime'])

df['date'] = df['DateTime'].dt.date
df['time'] = df['DateTime'].dt.time

import datetime
df['new'] = [datetime.datetime.combine(a, b) for a, b in Zip(df['date'], df['time'])]
print (df)

             DateTime        date      time                 new
0 2011-01-01 12:48:20  2011-01-01  12:48:20 2011-01-01 12:48:20
1 2014-01-01 12:30:45  2014-01-01  12:30:45 2014-01-01 12:30:45

または、文字列に変換し、結合して再度変換します。

df['new'] = pd.to_datetime(df['date'].astype(str) + ' ' +df['time'].astype(str))
print (df)
             DateTime        date      time                 new
0 2011-01-01 12:48:20  2011-01-01  12:48:20 2011-01-01 12:48:20
1 2014-01-01 12:30:45  2014-01-01  12:30:45 2014-01-01 12:30:45

ただし、時間をタイムデルタに変換して時間を削除するためにfloorを使用する場合は、+のみを使用してください。

df['date'] = df['DateTime'].dt.floor('d')
df['time'] = pd.to_timedelta(df['DateTime'].dt.strftime('%H:%M:%S'))

df['new'] = df['date'] + df['time']
print (df)

             DateTime       date     time                 new
0 2011-01-01 12:48:20 2011-01-01 12:48:20 2011-01-01 12:48:20
1 2014-01-01 12:30:45 2014-01-01 12:30:45 2014-01-01 12:30:45
1
jezrael

それを日時形式に戻す方法時間列

誤解があるようです。 Pandas datetime series must日付と時刻のコンポーネントを含める。これは交渉不可です。日付を指定せずにpd.to_datetimeを使用できます。デフォルトの1900-01-01日付を使用します:

# date from jezrael

print(pd.to_datetime(df['time'], format='%H:%M:%S'))

0   1900-01-01 12:48:20
1   1900-01-01 12:30:45
Name: time, dtype: datetime64[ns]

または、別の日付コンポーネントを使用します。たとえば、今日の日付です。

today = pd.Timestamp('today').strftime('%Y-%m-%d')
print(pd.to_datetime(today + ' '  + df['time'].astype(str)))

0   2018-11-25 12:48:20
1   2018-11-25 12:30:45
Name: time, dtype: datetime64[ns]

または、dateシリーズとtimeシリーズから再結合します。

print(pd.to_datetime(df['date'].astype(str) + ' ' + df['time'].astype(str)))

0   2011-01-01 12:48:20
1   2014-01-01 12:30:45
dtype: datetime64[ns]
0
jpp