Python Pandasを使用して日付と時刻の列を組み合わせる


113

私は次の列を持つパンダのデータフレームを持っています。

Date              Time
01-06-2013      23:00:00
02-06-2013      01:00:00
02-06-2013      21:00:00
02-06-2013      22:00:00
02-06-2013      23:00:00
03-06-2013      01:00:00
03-06-2013      21:00:00
03-06-2013      22:00:00
03-06-2013      23:00:00
04-06-2013      01:00:00

data ['Date']とdata ['Time']を組み合わせて以下を取得するにはどうすればよいですか?それを使用してそれを行う方法はありpd.to_datetimeますか?

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

すべての回答をありがとう。私はそれらのほとんどを試しましたが、それでもこの日時情報をより大きなデータフレームの一部として追加するとします。日時列には日付のみが表示され、時刻情報は表示されません。時間はそこに隠されているのでしょうか、それとも削除されているのでしょうか?
karthikeyan

回答:


169

たとえば、を使用していた場合は、これを直接読み取ることができた可能性があることに言及する価値があります。read_csvparse_dates=[['Date', 'Time']]

これらが単なる文字列であると仮定すると、それらを(スペースで)単に追加して、適用することができますto_datetime

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]

注:意外にも(私にとって)、これはNaNがNaTに変換されると正常に機能しますが、変換(おそらくraise引数を使用する)を心配する価値があります。


6
自動結合機能については知りませんでしたparse_dates=[['Start date', 'Start time'], ['End date', 'End time']])。次のように複数のエントリでも機能します。パンダ<3
5agado

43

受け入れられた回答は、データ型の列に対して機能しますstring。完全を期すために:列がデータ型である場合にこれを行う方法を検索するときに、この質問に遭遇しました:日付と時刻。

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

2
timeパンダでは、dtype について何も見つかりません。私はtimedelta(とdatetime)を持っていますが、その場合はそれらを追加する必要があります。私の回答を参照してください
toto_tico

Excelが「Time」と識別するExcel列を「pd.read_excel」すると、pandasも解析引数を必要とせずに自動的に「Time」として読み取ります。この解決策をありがとう。+1
2018年

1
ただ注意してください。pandas1.0.0以降pd.datetime は非推奨になり、datetime代わりにモジュールを明示的にインポートすることをお勧めします。
CopOnTheRun

16

これを使用して、日付と時刻をデータフレームの同じ列にマージできます。

import pandas as pd    
data_file = 'data.csv' #path of your file

マージされた列を含む.csvファイルの読み取りDate_Time:

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

この行を使用して、他の両方の列も保持できます。

data.set_index(['Date', 'Time'], drop=False)

1
date_parserたとえば、カスタムを使用することもできますparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

タイプが異なる場合は列をキャストでき(datetimeとtimestampまたはstr)、to_datetimeを使用できます。

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

結果:

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00

ベスト、


10

私はjka.neにコメントするのに十分な評判がありません:

jka.neの行を修正して、機能させる必要がありました。

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

これは他の人を助けるかもしれません。

また、私はreplace代わりにを使用して別のアプローチをテストしましたcombine

def combine_date_time(df, datecol, timecol):
    return df.apply(lambda row: row[datecol].replace(
                                hour=row[timecol].hour,
                                minute=row[timecol].minute),
                    axis=1)

OPの場合は次のようになります。

combine_date_time(df, 'Date', 'Time')

私は比較的大きなデータセット(> 500.000行)の両方のアプローチの時間を計りました、そして、それらは両方とも同様のランタイムを持っていますが、使用combineはより高速です(59 replace対50 combine)。


5

答えは、実際には列のタイプが何であるかに依存します。私の場合、とがdatetimeありましたtimedelta

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]

この場合は、列を追加するだけです。

> df['Date'] + df['Time']

受け入れられた回答は文字列を前提としています:「これらは単に(スペースを入れて)一緒に追加できる文字列であると仮定します」。私の答えはのためのものであるdatetimetimedelta。主な答えは、どういうわけか、列が文字列であったこと、または質問を投稿したものに対して機能したのは単に答えであったことを理解しています。
toto_tico

4

とオブジェクトdatetimeを組み合わせることdatetimeで、文字列連結なしに変換することもできtimedeltaます。と組み合わせるとpd.DataFrame.pop、ソースシリーズを同時に削除できます。

df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))

print(df)

             DateTime
0 2013-01-06 23:00:00
1 2013-02-06 01:00:00
2 2013-02-06 21:00:00
3 2013-02-06 22:00:00
4 2013-02-06 23:00:00
5 2013-03-06 01:00:00
6 2013-03-06 21:00:00
7 2013-03-06 22:00:00
8 2013-03-06 23:00:00
9 2013-04-06 01:00:00

print(df.dtypes)

DateTime    datetime64[ns]
dtype: object

1
素晴らしい一般的な解決策!「datetime date」と「str time」と入力すると、これでうまくいきました。
スズメ

3

最初に、適切なデータ型があることを確認します。

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])

次に、それらを簡単に結合します。

df["DateTime"] = df["Date"] + df["Time"]


2

私のデータセットには数日間1秒の解像度データがあり、ここで提案された方法による解析は非常に遅かったです。代わりに私は使用しました:

dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes  = dates + times

cache=Trueファイルには一意の日付が2、3しか含まれていないため、を使用すると日付の解析が非常に効率的になります。これは、日付と時刻の組み合わせの列には当てはまりません。


これが私がすることです。
Yaakov Bressler、

1

データ:

<TICKER>、<PER>、<DATE>、<TIME>、<OPEN>、<HIGH>、<LOW>、<CLOSE>、<VOL> SPFB.RTS、1、20190103,100100、106580.0000000,107260.0000000,106570.0000000 、107230.0000000、3726

コード:

data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.