Pertama, kumpulan data saya ditampilkan di bawah

here

Yang ingin saya lakukan adalah mengelompokkan kolom saya menurut pickup_datetime jam. Saya telah menemukan pertanyaan terkait di di sini tetapi untuk beberapa alasan solusinya sepertinya tidak berhasil. Saya telah menyertakan upaya saya di bawah ini.

Saya pertama kali memulai dengan ini:

df["dropoff_datetime"] = pd.to_datetime(df["dropoff_datetime"])
df["pickup_datetime"] = pd.to_datetime(df["pickup_datetime"])

test = df.groupby(df.hour).sum()

Dan saya mendapatkan kesalahan berikut:

AttributeError: 'DataFrame' object has no attribute 'hour'

Kemudian saya mencoba ini:

test = df.groupby(df.dropoff_datetime.hour).sum()

Dan saya mendapatkan kesalahan berikut:

AttributeError: 'Series' object has no attribute 'hour'

Saya agak bingung karena sepertinya situasi saya sama dengan pertanyaan yang ditautkan di atas. Saya tidak yakin mengapa saya mendapatkan kesalahan. Bantuan apa pun akan sangat dihargai

3
madsthaks 8 Agustus 2017, 12:19

2 jawaban

Jawaban Terbaik

Kita dapat menggunakan Series.dt.hour pengakses:

test = df.groupby(df['pickup_datetime'].dt.hour).sum()

Berikut adalah contoh yang menjelaskan perbedaannya:

In [136]: times = pd.to_datetime(['2017-08-01 13:13:13', '2017-08-01 20:20:20'])

In [137]: times
Out[137]: DatetimeIndex(['2017-08-01 13:13:13', '2017-08-01 20:20:20'], dtype='datetime64[ns]', freq=None)

In [138]: type(times)
Out[138]: pandas.core.indexes.datetimes.DatetimeIndex

In [139]: times.hour
Out[139]: Int64Index([13, 20], dtype='int64')

Seperti yang ditunjukkan di atas DatetimeIndex memiliki pengakses .hour "langsung", tetapi Series dari datetime dtype memiliki .dt.hour pengakses:

In [140]: df = pd.DataFrame({'Date': times})

In [141]: df
Out[141]:
                 Date
0 2017-08-01 13:13:13
1 2017-08-01 20:20:20

In [142]: type(df.Date)
Out[142]: pandas.core.series.Series

In [143]: df['Date'].dt.hour
Out[143]:
0    13
1    20
Name: Date, dtype: int64

Jika kita menetapkan kolom Date sebagai indeks:

In [146]: df.index = df['Date']

In [147]: df
Out[147]:
                                   Date
Date
2017-08-01 13:13:13 2017-08-01 13:13:13
2017-08-01 20:20:20 2017-08-01 20:20:20

Menjadi:

In [149]: type(df.index)
Out[149]: pandas.core.indexes.datetimes.DatetimeIndex

Sehingga kita dapat mengaksesnya secara langsung (tanpa pengakses .dt) lagi:

In [148]: df.index.hour
Out[148]: Int64Index([13, 20], dtype='int64', name='Date')
6
MaxU 8 Agustus 2017, 09:29

Perlu .dt karena bekerja dengan Series - Series.dt.hour:

test = df.groupby(df.dropoff_datetime.dt.hour).sum()

Tetapi jika DatetimeIndex, hilangkan - DatetimeIndex.hour:

test = df.groupby(df.index.hour).sum()
1
jezrael 8 Agustus 2017, 09:20