de-vraag
  • Ερωτήσεις
  • Ετικέτες
  • Χρήστες
Ειδοποιήσεις
Ανταμοιβές
Εγγραφή
Μόλις εγγραφείτε, θα ενημερωθείτε για τις απαντήσεις και τα σχόλια στις ερωτήσεις σας.
Συνδεθείτε
Αν έχετε ήδη λογαριασμό, συνδεθείτε για να ελέγξετε τις νέες ειδοποιήσεις.
Θα υπάρξουν ανταμοιβές για πρόσθετες ερωτήσεις, απαντήσεις και σχόλια.
Περισσότερα
Πηγή
Επεξεργασία
 darkpool
darkpool
Ερώτηση

Επιλογή γραμμών DataFrame μεταξύ δύο ημερομηνιών

Δημιουργώ ένα DataFrame από ένα csv ως εξής:

stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)

Το DataFrame έχει μια στήλη ημερομηνίας. Υπάρχει τρόπος να δημιουργήσω ένα νέο DataFrame (ή απλά να αντικαταστήσω το υπάρχον) το οποίο να περιέχει μόνο γραμμές με τιμές ημερομηνίας που εμπίπτουν σε ένα καθορισμένο εύρος ημερομηνίας ή μεταξύ δύο καθορισμένων τιμών ημερομηνίας;

163 2015-03-31T13:38:06+00:00 3
Ezra Citron
Ezra Citron
Επεξεργασμένη ερώτηση Κάνε Αύγουστος 2018 в 4:25
Προγραμματισμός
python
pandas
Αυτή η ερώτηση έχει 1 απάντηση στα αγγλικά, για να τις διαβάσετε συνδεθείτε στο λογαριασμό σας.
Λύση / Απάντηση
 unutbu
unutbu
Κάνε Μάρτιος 2015 в 1:49
2015-03-31T13:49:49+00:00
Περισσότερα
Πηγή
Επεξεργασία
#27170336

Υπάρχουν δύο πιθανές λύσεις:

  • loc[mask]`
  • Ορίστε τη στήλη ημερομηνίας ως DatetimeIndex, στη συνέχεια χρησιμοποιήστε df[start_date : end_date]

Χρησιμοποιώντας μια μάσκα boolean:

Βεβαιωθείτε ότι df['date'] είναι μια σειρά με τύπο dtype datetime64[ns]:

df['date'] = pd.to_datetime(df['date'])  

Κάντε μια μάσκα boolean. Οι ημερομηνίες start_date και end_date μπορούν να είναι datetime.datetime, np.datetime64s, pd.Timestamps, ή ακόμη και συμβολοσειρές datetime:

#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date'] <= end_date)

Επιλέξτε το υποπλαίσιο δεδομένων:

df.loc[mask]

ή αναθέστε εκ νέου στο df

df = df.loc[mask]

Για παράδειγμα,

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')
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
print(df.loc[mask])

αποδίδει

            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

Χρησιμοποιώντας ένα DatetimeIndex:

Εάν πρόκειται να κάνετε πολλές επιλογές με βάση την ημερομηνία, μπορεί να είναι πιο γρήγορο να ορίσετε το ημερομηνία ως δείκτη πρώτα. Στη συνέχεια, μπορείτε να επιλέξετε γραμμές ανά ημερομηνία χρησιμοποιώντας 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'])

αποδίδει

                   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, π.χ. seq[start:end] περιλαμβάνει την start αλλά όχι το end, αντίθετα, το Pandas df.loc[start_date : end_date] περιλαμβάνει και τα δύο τελικά σημεία στο αποτέλεσμα αν βρίσκονται στο ευρετήριο. Ωστόσο, ούτε η start_date ούτε η end_date πρέπει να βρίσκονται στο ευρετήριο.


Σημειώστε επίσης ότι η pd.read_csv έχει μια παράμετρο parse_dates την οποία θα μπορούσατε να χρησιμοποιήσετε για να αναλύσετε τη στήλη date ως datetime64. Έτσι, αν χρησιμοποιήσετε την parse_dates, δεν θα χρειαστεί να χρησιμοποιήσετε την df['date'] = pd.to_datetime(df['date']).

Jinhua Wang
Jinhua Wang
Επεξεργασμένη απάντηση Κάνε Ιούνιος 2019 в 12:19
337
0
Christin Jose
Christin Jose
Κάνε Ιούλιος 2016 в 1:00
2016-07-13T01:00:33+00:00
Περισσότερα
Πηγή
Επεξεργασία
#27170337

Θεωρώ ότι η καλύτερη επιλογή θα είναι να χρησιμοποιήσετε τους άμεσους ελέγχους αντί να χρησιμοποιήσετε τη λειτουργία loc:

df = df[(df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')]

Λειτουργεί για μένα.

Σημαντικό ζήτημα με τη συνάρτηση loc με μια φέτα είναι ότι τα όρια θα πρέπει να υπάρχουν στις πραγματικές τιμές, αν όχι αυτό θα οδηγήσει σε KeyError.

49
0
Jonny Brooks
Jonny Brooks
Κάνε Ιανουάριος 2017 в 8:47
2017-01-23T08:47:36+00:00
Περισσότερα
Πηγή
Επεξεργασία
#27170338

Μπορείτε να χρησιμοποιήσετε τη μέθοδο isin στη στήλη date ως εξής df[df["date"].isin(pd.date_range(start_date, end_date))]

Σημείωση: Αυτό λειτουργεί μόνο με ημερομηνίες (όπως ζητάει η ερώτηση) και όχι με χρονοσφραγίδες.

Παράδειγμα:

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

το οποίο δίνει

           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
Jonny Brooks
Jonny Brooks
Επεξεργασμένη απάντηση Κάνε Σεπτέμβριος 2018 в 10:25
18
0
Προσθήκη ερώτησης
Κατηγορίες
Όλα
Τεχνολογία
Πολιτισμός / Αναψυχή
Ζωή / Τέχνες
Επιστήμη
Επαγγελματικό
Επιχείρηση
Χρήστες
Όλα
Νέα
Δημοφιλές
1
Виталий Теслюк
Εγγεγραμμένη πριν 1 μέρα
2
shokir qochqorov
Εγγεγραμμένη πριν 1 μέρα
3
Roxana Elizabeth CASTILLO Avalos
Εγγεγραμμένη πριν 1 εβδομάδα
4
Hideo Nakagawa
Εγγεγραμμένη πριν 1 εβδομάδα
5
Sergiy Tytarenko
Εγγεγραμμένη πριν 1 εβδομάδα
DA
DE
EL
ES
FR
ID
IT
JA
KO
LV
NL
PT
RU
SK
TR
ZH
© de-vraag 2022
Πηγή
stackoverflow.com
με άδεια cc by-sa 3.0 με αναφορά