2015-09-16 5 views
2

Я использую Python 2.7, PyCharm и Anaconda,Получить последнюю дату каждого месяца в списке дат в Python

У меня есть list дат, и я хотел бы получить последнюю дату каждого месяц присутствует в массиве.

Есть ли какие-либо функции или библиотеки, которые могли бы мне помочь?

Я прочитал даты из файла CSV и сохранил их как datetime.

У меня есть следующий код:

Dates=[] 
Dates1=[] 
for date in dates: 
    temp=xlrd.xldate_as_tuple(int(date),0) 
    Dates1.append(datetime.datetime(temp[0],temp[1],temp[2])) 

for date in Dates1: 
    if not (date<startDate or date>endDate): 
     Dates.append(date) 

Чтобы сделать это ясно, предположим, у меня есть:

Dates = [2015-01-20, 2015-01-15, 2015-01-17, 2015-02-21, 2015-02-06] 

(Считают быть в формате datetime.)

В списке я d хотел бы получить:

[2015-01-20, 2015-02-21] 

До сих пор я искал googled вокруг, особенно в Stack Overflow, но я мог найти ответы только на то, как я могу получить последнюю дату каждого месяца, но не из указанного пользователем списка.

+2

Можете ли вы показать нам код, который вы написали, который производит эти даты? что ты уже испробовал? – rayryeng

+0

Найдите фактическую последнюю дату месяца и вычтите каждую дату с этой даты. Наименьшее число является самым близким. –

+0

См. Мой ответ. Если это сработает для вас, не могли бы вы принять его и перенести? –

ответ

2

Pandas может справиться с этой задачей очень хорошо. Загрузите свой CSV в фрейм данных, затем запустите группу по месяцу и найдите максимальную дату, используя функцию агрегата:

import pandas as pd 
import numpy as np 

df = pd.read_csv('/path/to/file/')   # Load a dataframe with your file 
df.index = df['my_date_field']    # set the dataframe index with your date 
dfg = df.groupby(pd.TimeGrouper(freq='M')) # group by month/alternatively use MS for Month Start/referencing the previously created object 

# Finally, find the max date in each month 
dfg.agg({'my_date_field': np.max}) 

# To specifically coerce the results of the groupby to a list: 
dfg.agg({'my_date_field': np.max})['my_date_field'].tolist() 
+0

все же я получаю объект '', и я не могу получить доступ к нему как к обычному списку/массиву. как dfg [0] –

+0

Еще один шаг, который нужно изменить из DataFrameGroupBy в список: 'dfg.agg ({'a_date': np.max}) ['a_date']. tolist() # Выберите столбец и coerce' – leroyJr

+1

Если в вашей проекции данных есть только один столбец, вы выдаете более простую совокупную команду (только функцию): 'Dates.groupby (pd.TimeGrouper (freq = 'M')). agg (np.max). ToList() ' – leroyJr

4

За год y и месяц m, calendar.monthrange(y, m)[1] возвращает день последнего номера месяца.

Следующий сценарий принимает список datetime объекта под названием dates и создает новый список, month_last_dates, содержащий datetime объекты, соответствующие последней даты каждого месяца, в котором члены dates падения.

import datetime 
import calendar 

tuples = [(2015, 8, 1), (2015, 9, 16), (2015, 10, 4)] 
dates = [datetime.datetime(y, m, d) for y, m, d in tuples] 

month_last_dates = len(dates) * [None] 
for i, date in enumerate(dates): 
    y, m, d = date.year, date.month, date.day 
    last = calendar.monthrange(y, m)[1] 
    print y, m, last # Output for testing purposes. 
    month_last_dates[i] = datetime.datetime(y, m, last) 

Вот эквивалентный скрипт, написанный более сжато с помощью списка понимания:

import datetime 
import calendar 

tuples = [(2015, 8, 1), (2015, 9, 16), (2015, 10, 4)] 
dates = [datetime.datetime(y, m, d) for y, m, d in tuples] 

month_last_dates = [datetime.datetime(date.year, date.month, 
     calendar.monthrange(date.year, date.month)[1]) for date in dates] 

# Output for testing purposes. 
for date in month_last_dates: 
    print date.year, date.month, date.day 

В вашем случае, учитывая список Dates, вы можете создать новый список, как это:

last_dates = [datetime.datetime(date.year, date.month, 
     calendar.monthrange(date.year, date.month)[1]) for date in Dates] 
+0

Это хороший ответ, но полученный список имеет тот же размер, что и предыдущий, в идеале мне нужен список с уникальными датами. Есть идеи ? благодаря ! –

+1

Конечно, вы можете сделать это до 'last_dates'. Напишите: 'last_dates = list (set (last_dates))' после кода, который я вам дал выше. –

Смежные вопросы