Es veidoju DataFrame no csv šādi:
stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)
DataFrame ir datuma sleja. Vai ir veids, kā izveidot jaunu DataFrame (vai vienkārši pārrakstīt esošo), kas satur tikai rindas ar datuma vērtībām, kas ietilpst noteiktā datuma diapazonā vai starp divām norādītām datuma vērtībām?
Ir divi iespējamie risinājumi:
df.loc[maska]
.df[start_date : end_date]
.Pielietojot bauda masku:
Pārliecinieties, ka df['date']
ir Series ar dtype datetime64[ns]
:
df['date'] = pd.to_datetime(df['date'])
Izveidojiet boolean masku. start_date
un end_date
var būt datetime.datetime
,
np.datetime64
s, pd.Timestamp
s vai pat datetime virknes:
#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date'] <= end_date)
Izvēlieties apakšdatu kadru:
df.loc[mask]
vai pārklasificēt uz df
df = df.loc[mask]
Piemēram,
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')
maska = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
print(df.loc[maska])
iegūst
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
Izmantojot DatetimeIndex:
Ja plānojat veikt daudz atlases pēc datuma, iespējams, būs ātrāk iestatīt
datuma
kolonnu vispirms izmantot kā indeksu. Pēc tam varat atlasīt rindas pēc datuma, izmantojot
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(['date'])
print(df.loc['2000-6-1':'2000-6-10'])
```
iegūst
```
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 saraksta indeksēšana, piemēram, `seq[start:end]` ietver `start`, bet ne `end`, savukārt Pandas `df.loc[start_date : end_date]` ietver *abus* beigu punktus rezultātā, ja tie ir indeksā. Tomēr ne `start_date`, ne `end_date` nav jābūt indeksā.
----------
Jāņem vērā arī, ka [`pd.read_csv` ir `parse_dates` parametrs](http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.parsers.read_csv.html), ko jūs varētu izmantot, lai izanalizētu `date` kolonnu kā `datetime64`. Tādējādi, izmantojot `parse_dates`, jums nevajadzēs izmantot `df['date'] = pd.to_datetime(df['date'])`.
Man šķiet, ka labākais risinājums būs izmantot tiešās pārbaudes, nevis funkciju loc:
df = df[(df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')]
Man tas darbojas.
Galvenā problēma ar loc funkciju ar slice ir tā, ka robežām jābūt faktiskajās vērtībās, ja tā nav, tas radīs KeyError.
Metodi isin
kolonnai date
varat izmantot šādi.
df[df[df["date"].isin(pd.date_range(start_date, end_date))]
Piezīme: Tas darbojas tikai ar datumiem (kā prasīts jautājumā), nevis laika zīmēm.
Piemērs:
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
kas dod
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