Chcę utworzyć listę dat, zaczynając od dzisiaj i cofając dowolną liczbę dni, powiedzmy w moim przykładzie 100 dni. Czy jest na to lepszy sposób?
import datetime
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
dateList.append(a - datetime.timedelta(days = x))
print dateList
range(0, numdays)
w tym przypadku?datetimes = [start + timedelta(seconds=x*60+randint(-30, 30)) for x in range (0, range_end*5, 5)]
gdzie zmiennarange_end = 10
Pandas
jest świetny do szeregów czasowych i ma bezpośrednie wsparcie dla zakresów dat.Na przykład
pd.date_range()
:Ma również wiele opcji ułatwiających życie. Na przykład, jeśli chcesz tylko dni robocze, po prostu zamienisz się
bdate_range
.Zobacz dokumentację zakresu dat
Ponadto w pełni obsługuje strefy czasowe pytza i może płynnie obejmować wiosenne / jesienne zmiany czasu letniego.
EDYCJA przez OP:
Jeśli potrzebujesz rzeczywistych czasów danych w Pythonie, w przeciwieństwie do znaczników czasu Pandas:
Używa parametru „koniec”, aby dopasować oryginalne pytanie, ale jeśli chcesz mieć daty malejące:
źródło
list(map(pd.Timestamp.to_pydatetime, datelist))
odzyskać typ datetime ...pandas.datetime
Klasa jest przestarzała i zostanie usunięty z pand w wersji przyszłości.datetime
Zamiast tego importuj z modułu.Uzyskaj zakres dat między określoną datą początkową i końcową (zoptymalizowany pod kątem złożoności czasu i przestrzeni):
źródło
(end-start+1)
nie działa, nie można dodać timedelta i int. Możesz jednak użyć(end-start).days + 1
.Możesz napisać funkcję generatora, która zwraca obiekty daty od dziś:
Ten generator zwraca daty zaczynające się od dzisiaj i cofające się o jeden dzień na raz. Oto jak wziąć pierwsze 3 daty:
Zaletą tego podejścia w porównaniu ze zrozumieniem pętli lub listy jest to, że możesz cofać się tyle razy, ile chcesz.
Edytować
Bardziej kompaktowa wersja wykorzystująca wyrażenie generatorowe zamiast funkcji:
Stosowanie:
źródło
tak, wynajdź koło ... po prostu przeszukaj forum, a otrzymasz coś takiego:
źródło
dateutil.rrule
implementuje iCalendar RFC - łatwiej jest korzystać z funkcji o dobrze zdefiniowanym zachowaniu zamiast wielu implementacji o prawie takiej samej funkcjonalności, które są jeszcze nieco inne.dateutil.rrule
pozwala ograniczyć naprawianie błędów w jednym miejscu.rrule
nazwa nie jest dowolna; pochodzi z odpowiedniego rfcAby uprościć tę czynność, możesz także użyć dziennej porządkowej:
Lub zgodnie z sugestiami w komentarzach możesz utworzyć taką listę:
źródło
Z tytułu tego pytania spodziewałem się znaleźć coś takiego
range()
, co pozwoliłoby mi określić dwie daty i stworzyć listę ze wszystkimi datami pomiędzy nimi. W ten sposób nie trzeba obliczać liczby dni między tymi dwiema datami, jeśli nie znamy ich wcześniej.Więc z ryzykiem nieco nie na temat, ten liniowiec wykonuje swoją pracę:
Wszystkie kredyty dla tej odpowiedzi !
źródło
Oto nieco inna odpowiedź oparta na odpowiedzi S.Lott, która podaje listę dat między dwiema datami
start
iend
. W poniższym przykładzie od początku 2017 r. Do dziś.źródło
Wiem trochę spóźnioną odpowiedź, ale właśnie miałem ten sam problem i zdecydowałem, że wewnętrznej funkcji zakresu Pythona trochę brakuje pod tym względem, więc przesłoniłem go w moim module użytkownika.
źródło
output = []
i zamienić linie wwhile cmp(...)
pętli. Porównajrange(0,10,1)
i_range(0,10,1)
.date_range
.Na podstawie odpowiedzi napisałem dla siebie:
Wynik:
Różnica polega na tym, że dostaję
date
przedmiot „niedatetime.datetime
”.źródło
Jeśli są dwie daty i potrzebujesz zakresu, spróbuj
źródło
Oto, co stworzyłem, z własnego kodu, może to pomóc. (Wiem, że pytanie jest za stare, ale inni mogą z niego skorzystać)
https://gist.github.com/2287345
(to samo poniżej)
źródło
Oto jeden linijka dla skryptów bash, aby uzyskać listę dni powszednich, to jest python 3. Łatwo modyfikowany do cokolwiek, int na końcu to liczba dni w przeszłości, którą chcesz.
Oto wariant zapewniający datę początkową (a raczej końcową)
Oto wariant dla dowolnych dat rozpoczęcia i zakończenia. nie że nie jest to zbyt wydajne, ale jest dobre do umieszczenia pętli for w skrypcie bash:
źródło
Związane z Matplotlib
źródło
Wiem, że udzielono na nie odpowiedzi, ale odłożę moją odpowiedź do celów historycznych i ponieważ uważam, że jest to prosta sprawa.
Jasne, że nie wygra czegoś takiego jak golf, ale myślę, że jest elegancki.
źródło
arange
krokami jest całkiem fajny, alelistOfDates
składa się z numpy datetime64 zamiast natywnych czasów danych w Pythonie.np.arange(…).astype(dt.datetime)
doarange
przywrócenia natywnego zapytania datetime zamiast numpy datetime64.Kolejny przykład, który liczy się do przodu lub do tyłu, zaczynając od odpowiedzi Sandeepa.
daje
i
daje
Pamiętaj, że data początkowa jest podana w zwrocie, więc jeśli chcesz mieć cztery daty całkowite, użyj
timedelta(days=3)
źródło
źródło
Generator miesięcznych zakresów dat z
datetime
idateutil
. Prosty i łatwy do zrozumienia:źródło
źródło
end
powinno byćbase - datetime.timedelta
. Co więcej ... Dlaczego to rozwiązanie jest lepsze od oryginalnego?Z powyższych odpowiedzi stworzyłem ten przykład dla generatora daty
źródło