Saya menggunakan pandas / python dan saya memiliki dua seri waktu tanggal s1 dan s2, yang telah dihasilkan menggunakan fungsi 'to_datetime' pada bidang df yang berisi tanggal / waktu.
Saat saya mengurangi s1 dari s2
s3 = s2 - s1
Saya mendapatkan seri, s3, tipe
timedelta64 [ns]
0 385 days, 04:10:36
1 57 days, 22:54:00
2 642 days, 21:15:23
3 615 days, 00:55:44
4 160 days, 22:13:35
5 196 days, 23:06:49
6 23 days, 22:57:17
7 2 days, 22:17:31
8 622 days, 01:29:25
9 79 days, 20:15:14
10 23 days, 22:46:51
11 268 days, 19:23:04
12 NaT
13 NaT
14 583 days, 03:40:39
Bagaimana cara melihat 1 elemen rangkaian:
s3 [10]
Saya mendapatkan sesuatu seperti ini:
numpy.timedelta64 (2069211000000000, 'ns')
Bagaimana cara mengekstrak hari dari s3 dan mungkin menyimpannya sebagai bilangan bulat (tidak terlalu tertarik dengan jam / menit, dll.)?
Terima kasih sebelumnya atas bantuannya.
s.apply(lambda x: x / np.timedelta64(1,'D'))
Jawaban:
Anda dapat mengonversinya menjadi timedelta dengan presisi hari. Untuk mengekstrak nilai integer hari Anda membaginya dengan timedelta satu hari.
>>> x = np.timedelta64(2069211000000000, 'ns') >>> days = x.astype('timedelta64[D]') >>> days / np.timedelta64(1, 'D') 23
Atau, seperti yang disarankan @PhillipCloud,
days.astype(int)
karenatimedelta
ini hanyalah bilangan bulat 64 bit yang diinterpretasikan dalam berbagai cara tergantung pada parameter kedua yang Anda berikan ('D'
,'ns'
, ...).Anda dapat menemukannya lebih lanjut di sini .
sumber
days.item().days
ataudays.astype(int)
.astype('timedelta64[D]')
(sekitar 96 ms) jauh lebih efisien daripadadt.days.
(sekitar 24 detik) untuk 4.000.000 baris.Menggunakan
dt.days
untuk mendapatkan atribut hari sebagai bilangan bulat.Misalnya:
In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T')) In [15]: s Out[15]: 0 1 days 00:00:00 1 3 days 02:00:00 2 5 days 04:00:00 3 7 days 06:00:00 4 9 days 08:00:00 5 11 days 10:00:00 dtype: timedelta64[ns] In [16]: s.dt.days Out[16]: 0 1 1 3 2 5 3 7 4 9 5 11 dtype: int64
Lebih umum - Anda dapat menggunakan
.components
properti untuk mengakses format yang diperkeciltimedelta
.In [17]: s.dt.components Out[17]: days hours minutes seconds milliseconds microseconds nanoseconds 0 1 0 0 0 0 0 0 1 3 2 0 0 0 0 0 2 5 4 0 0 0 0 0 3 7 6 0 0 0 0 0 4 9 8 0 0 0 0 0 5 11 10 0 0 0 0 0
Sekarang, untuk mendapatkan
hours
atribut:In [23]: s.dt.components.hours Out[23]: 0 0 1 2 2 4 3 6 4 8 5 10 Name: hours, dtype: int64
sumber
Misalkan Anda memiliki rangkaian timedelta:
import pandas as pd from datetime import datetime z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]}) td_series = (z['a'] - z['b'])
Salah satu cara untuk mengonversi kolom atau seri timedelta ini adalah dengan mentransmisikannya ke objek Timedelta (pandas 0.15.0+) dan kemudian mengekstrak hari dari objek:
td_series.astype(pd.Timedelta).apply(lambda l: l.days)
Cara lain adalah dengan mentransmisikan serial sebagai timedelta64 dalam beberapa hari, lalu mentransmisikannya sebagai int:
td_series.astype('timedelta64[D]').astype(int)
sumber