Удаление строк фрейма данных путем сравнения дат

#python #datetime #dataframe

#python #дата-время #фрейм данных

Вопрос:

У меня есть набор данных, и я хочу иметь строки только внутри временного диапазона. Я поместил все подходящие строки в объект Series. Но когда я повторно присваиваю этот объект объекту фрейма данных, я получаю значения NaT:

код:

 def get_tweets_from_range_in_csv():
    csvfile1 = "results_dataGOOGL050"
    df1 = temp(csvfile1)


def temp(csvfile):
    tweetdats = []
    d = pd.read_csv(csvfile   ".csv", encoding='latin-1')
    start = datetime.datetime.strptime("01-01-2018", "%d-%m-%Y")
    end = datetime.datetime.strptime("01-06-2018", "%d-%m-%Y")
    for index, current_tweet in d['Date'].iteritems():
        date_tw = datetime.datetime.strptime(current_tweet[:10], "%Y-%m-%d")
        if start <= date_tw <= end:
            tweetdats.append(date_tw)
        else:
            d.drop(index, inplace=True)
    d = d.drop("Likes", 1)
    d = d.drop("RTs", 1)
    d = d.drop("Sentiment", 1)
    d = d.drop("User", 1)
    d = d.drop("Followers", 1)
    df1['Date'] = pd.Series(tweetdats)
    return d
  

Вывод tweetdats:

 tweetdats
Out[340]: 
[datetime.datetime(2018, 1, 30, 0, 0),
 datetime.datetime(2018, 4, 1, 0, 0),
 datetime.datetime(2018, 4, 1, 0, 0),
 datetime.datetime(2018, 4, 1, 0, 0),
 datetime.datetime(2018, 1, 5, 0, 0),
 datetime.datetime(2018, 1, 5, 0, 0),
 datetime.datetime(2018, 1, 8, 0, 0),
 datetime.datetime(2018, 1, 20, 0, 0),
 datetime.datetime(2018, 1, 22, 0, 0),
 datetime.datetime(2018, 1, 5, 0, 0)]
  

Ответ №1:

Вам не нужно выполнять итерацию по вашему фрейму данных с for циклом, чтобы выбрать строки внутри интересующего временного диапазона.

Предположим, что ваш исходный фрейм данных df имеет столбец ‘Date’, содержащий даты в формате datetime; затем вы можете просто создать новый фрейм данных new_df :

 new_df=df[(pd.to_datetime(df.time) > start) amp; (pd.to_datetime(self.df.time) < end)] 
  

Таким образом, вам не нужно копировать и вставлять «хорошие» строки в серии, а затем переназначать их в фрейм данных.

Ваша temp функция будет выглядеть следующим образом:

 def temp(csvfile):
    df = pd.read_csv(csvfile   ".csv", encoding='latin-1')
    start = datetime.datetime.strptime("01-01-2018", "%d-%m-%Y")
    end = datetime.datetime.strptime("01-06-2018", "%d-%m-%Y")
    new_df=df[(pd.to_datetime(df.time) > start) amp; (pd.to_datetime(self.df.time) < end)]
  

Надеюсь, это поможет!