Próbuję uzyskać datę poprzedniego miesiąca za pomocą Pythona. Oto, czego próbowałem:
str( time.strftime('%Y') ) + str( int(time.strftime('%m'))-1 )
Jednak ten sposób jest zły z 2 powodów: po pierwsze zwraca 20122 dla lutego 2012 (zamiast 201202), a po drugie zwraca 0 zamiast 12 w styczniu.
Rozwiązałem ten problem w bash z
echo $(date -d"3 month ago" "+%G%m%d")
Myślę, że jeśli bash ma wbudowany sposób do tego celu, to znacznie lepiej wyposażony python powinien zapewnić coś lepszego niż zmuszanie do pisania własnego skryptu, aby osiągnąć ten cel. Oczywiście mógłbym zrobić coś takiego:
if int(time.strftime('%m')) == 1:
return '12'
else:
if int(time.strftime('%m')) < 10:
return '0'+str(time.strftime('%m')-1)
else:
return str(time.strftime('%m') -1)
Nie testowałem tego kodu i i tak nie chcę go używać (chyba że nie mogę znaleźć innego sposobu: /)
Dzięki za pomoc!
Odpowiedzi:
datetime i datetime.timedelta są Twoimi przyjaciółmi.
Lubię to:
201202
jest drukowane.źródło
.replace()
metody:datetime.utcnow().replace(day=1) - timedelta(days=1)
.replace()
funkcję. Zrób to raz, aby uzyskać ostatni miesiąc, a następnie zrób to ponownie, aby uzyskać żądany dzień. Najpierw:d = date.today()
potemone_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)
calendar
i używająccalendar.mdays[d.month-1]
więcej brzydoty wmin()
funkcji drugiejreplace
, ale wydaje się nie-Pythonic i nie uwzględnia przypadków narożnych. Zaktualizowałem moją odpowiedź poniżej, używająctry - except
kont we wszystkich przypadkach, chociaż nienawidzę używać wyjątków jako części algorytmu.Powinieneś użyć dateutil . Dzięki temu możesz użyć relativedelta, jest to ulepszona wersja timedelta.
źródło
Lub:
źródło
Opierając się na odpowiedzi bgporter .
źródło
Jest to bardzo łatwe i proste. Zrób to
Oto wynik: $ python2.7 main.py
źródło
Dla kogoś, kto tu dotarł i chce uzyskać zarówno pierwszy, jak i ostatni dzień poprzedniego miesiąca:
Wynik:
źródło
Calendar
modułu: stackabuse.com/introduction-to-the-python-calendar-moduleźródło
Dla zabawy, czysta matematyka za pomocą divmod. Całkiem nieefektywny ze względu na mnożenie, mógłby równie dobrze sprawdzić liczbę miesięcy (jeśli jest równa 12, zwiększyć rok itp.)
źródło
W bardzo kompletnej bibliotece Pendulum mamy
subtract
metodę (a nie „subStract”):Widzimy, że radzi sobie z latami skoków.
Odwrotny odpowiednik to
add
.https://pendulum.eustace.io/docs/#addition-and-subtraction
źródło
Opierając się na komentarzu @JF Sebastian, możesz połączyć
replace()
funkcję, aby cofnąć się o jeden „miesiąc”. Ponieważ miesiąc nie jest stałym okresem czasu, rozwiązanie to stara się cofnąć do tej samej daty poprzedniego miesiąca, co oczywiście nie sprawdza się dla wszystkich miesięcy. W takim przypadku algorytm domyślnie przyjmuje ostatni dzień poprzedniego miesiąca.Wynik:
źródło
Jeśli chcesz przyjrzeć się literom ASCII w pliku typu EXE w środowisku LINUX / UNIX, spróbuj "od -c 'nazwa_pliku' | więcej"
Prawdopodobnie otrzymasz wiele nierozpoznawalnych elementów, ale wszystkie zostaną zaprezentowane, a reprezentacje HEX zostaną wyświetlone, a znaki odpowiadające ASCII (jeśli są potrzebne) będą następować po linii kodów szesnastkowych. Wypróbuj go na skompilowanym fragmencie kodu, który znasz. Możesz zobaczyć w nim rzeczy, które rozpoznajesz.
źródło
Istnieje biblioteka wysokiego poziomu,
dateparser
która może określić datę przeszłą w języku naturalnym i zwrócić odpowiednidatetime
obiekt Pythonaźródło