Aşağıdaki gibi bir csv'den bir DataFrame oluşturuyorum:
stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)
DataFrame'in bir tarih sütunu vardır. Yalnızca belirli bir tarih aralığında veya belirtilen iki tarih değeri arasında kalan tarih değerlerine sahip satırları içeren yeni bir DataFrame oluşturmanın (veya mevcut olanın üzerine yazmanın) bir yolu var mı?
İki olası çözüm bulunmaktadır:
df.loc[maske]
kullanındf[start_date : end_date]
kullanınBoolean maske kullanılıyor:
df['date']öğesinin
datetime64[ns]` türünde bir Seri olduğundan emin olun:
df['date'] = pd.to_datetime(df['date'])
Bir boolean maskesi oluşturun. start_dateve
end_date`datetime.datetime
olabilir,
np.datetime64s,
pd.Timestamp`s veya hatta datetime dizeleri:
#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date'] <= end_date)
Alt Veri Çerçevesini seçin:
df.loc[mask]
veya df
olarak yeniden atayın
df = df.loc[mask]
Örneğin,
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((200,3)))
df['date'] = pd.date_range('2000-1-1', periods=200, freq='D')
maske = (df['tarih'] > '2000-6-1') & (df['tarih'] <= '2000-6-10')
print(df.loc[maske])
verim
0 1 2 date
153 0.208875 0.727656 0.037787 2000-06-02
154 0.750800 0.776498 0.237716 2000-06-03
155 0.812008 0.127338 0.397240 2000-06-04
156 0.639937 0.207359 0.533527 2000-06-05
157 0.416998 0.845658 0.872826 2000-06-06
158 0.440069 0.338690 0.847545 2000-06-07
159 0.202354 0.624833 0.740254 2000-06-08
160 0.465746 0.080888 0.155452 2000-06-09
161 0.858232 0.190321 0.432574 2000-06-10
Bir DatetimeIndex kullanarak:
Tarihe göre çok sayıda seçim yapacaksanız, tarih ayarını
önce dizin olarak date
sütununu kullanın. Daha sonra aşağıdakileri kullanarak satırları tarihe göre seçebilirsiniz
df.loc[start_date:end_date]
.
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((200,3)))
df['date'] = pd.date_range('2000-1-1', periods=200, freq='D')
df = df.set_index(['tarih'])
print(df.loc['2000-6-1':'2000-6-10'])
verim
0 1 2
date
2000-06-01 0.040457 0.326594 0.492136 # <- includes start_date
2000-06-02 0.279323 0.877446 0.464523
2000-06-03 0.328068 0.837669 0.608559
2000-06-04 0.107959 0.678297 0.517435
2000-06-05 0.131555 0.418380 0.025725
2000-06-06 0.999961 0.619517 0.206108
2000-06-07 0.129270 0.024533 0.154769
2000-06-08 0.441010 0.741781 0.470402
2000-06-09 0.682101 0.375660 0.009916
2000-06-10 0.754488 0.352293 0.339337
Python liste indekslemesi, örneğin seq[start:end]
start
ı içerir ancak end
i içermezken, bunun aksine Pandas df.loc[start_date : end_date]
indekste yer alıyorlarsa her iki uç noktayı da sonuca dahil eder. Ancak ne start_date
ne de end_date
dizinde olmak zorunda değildir.
Ayrıca, date
sütununu datetime64
olarak ayrıştırmak için kullanabileceğiniz bir parse_dates
parametresi](http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.parsers.read_csv.html) olduğunu unutmayın. Böylece, eğer parse_dates
kullanırsanız, df['date'] = pd.to_datetime(df['date'])
kullanmanıza gerek kalmayacaktır.
En iyi seçeneğin loc fonksiyonunu kullanmak yerine doğrudan kontrolleri kullanmak olacağını düşünüyorum:
df = df[(df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')]
Bende işe yarıyor.
Dilimli loc fonksiyonu ile ilgili en önemli sorun, limitlerin gerçek değerlerde mevcut olması gerektiğidir, aksi takdirde bu KeyError ile sonuçlanacaktır.
Tarih sütununda isin
yöntemini aşağıdaki gibi kullanabilirsiniz
df[df["date"].isin(pd.date_range(start_date, end_date))]
Not: Bu yalnızca tarihlerle çalışır (soruda sorulduğu gibi), zaman damgalarıyla çalışmaz.
Örnek:
import numpy as np
import pandas as pd
# Make a DataFrame with dates and random numbers
df = pd.DataFrame(np.random.random((30, 3)))
df['date'] = pd.date_range('2017-1-1', periods=30, freq='D')
# Select the rows between two dates
in_range_df = df[df["date"].isin(pd.date_range("2017-01-15", "2017-01-20"))]
print(in_range_df) # print result
hangi verir
0 1 2 date
14 0.960974 0.144271 0.839593 2017-01-15
15 0.814376 0.723757 0.047840 2017-01-16
16 0.911854 0.123130 0.120995 2017-01-17
17 0.505804 0.416935 0.928514 2017-01-18
18 0.204869 0.708258 0.170792 2017-01-19
19 0.014389 0.214510 0.045201 2017-01-20