Reputation: 3241
I wanted to get the first and last day of years, i.e., range of the day of years for each month in python.
I tried as follows:
import datetime, numpy as np
dates = np.arange(np.datetime64('2014-01-01'), np.datetime64('2015-01-01'))
dates = [datetime.datetime.strptime(str(x),"%Y-%m-%d") for x in dates]
DayOfYears = [datetime.datetime.strptime(str(x),"%j") for x in dates]
Months = [datetime.datetime.strptime(str(x),"%B") for x in dates]
My code did not work in terms of getting DayOfYears and Months. It is giving ValueError: unconverted data remains: 4-01-01 00:00:00
Finally, I have to print out the result in this form:
January 01 31
February 32 60
May 122 152
December 335 365
How is the good way of doing it, guys?
EDIT:
input_dates = ['2014-01-01', '2014-01-02', '2014-02-03', '2014-02-04', '2014-05-05', '2014-05-06', '2014-05-07', '2014-05-08']
output_answer:
January 1 31
February 32 60
May 122 152.
Upvotes: 1
Views: 1211
Reputation: 180411
import calendar
start = datetime.datetime(2012,01,01)
end = datetime.datetime(2015,01,01)
e = 0
while start != end:
months = calendar.monthrange(start.year,start.month)
e += months[1]
print("{} {} {}".format(start.strftime("%B"),e-months[1]+1, e))
start += datetime.timedelta(days=months[1])
January 1 31
February 32 60
March 61 91
April 92 121
May 122 152
June 153 182
......
You have datetime objects so use strftime, you are trying to parse strings like 2014-01-01
which don't match %j
that is why you get an error:
dayOfYears = [x.strftime("%j") for x in dates]
It is the same for months:
Months = [x.strftime("%B") for x in dates]
Now days and months look like:
['001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019', '020', '021', '022', '023', '024', '025', '026', '027', '028', '029', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '043', '044', '045', '046', '047', '048', '049', '050', '051', '052', '053', '054', '055', '056', '057', '058', '059', '060', '061', '062', '063', '064', '065', '066', '067', '068', '069', '070', '071', '072', '073', '074', '075', '076', '077', '078', '079', '080', '081', '082', '083', '084', '085', '086', '087', '088', '089', '090', '091', '092', '093', '094', '095', '096', '097', '098', '099', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129', '130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '140', '141', '142', '143', '144', '145', '146', '147', '148', '149', '150', '151', '152', '153', '154', '155', '156', '157', '158', '159', '160', '161', '162', '163', '164', '165', '166', '167', '168', '169', '170', '171', '172', '173', '174', '175', '176', '177', '178', '179', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189', '190', '191', '192', '193', '194', '195', '196', '197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207', '208', '209', '210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', '253', '254', '255', '256', '257', '258', '259', '260', '261', '262', '263', '264', '265', '266', '267', '268', '269', '270', '271', '272', '273', '274', '275', '276', '277', '278', '279', '280', '281', '282', '283', '284', '285', '286', '287', '288', '289', '290', '291', '292', '293', '294', '295', '296', '297', '298', '299', '300', '301', '302', '303', '304', '305', '306', '307', '308', '309', '310', '311', '312', '313', '314', '315', '316', '317', '318', '319', '320', '321', '322', '323', '324', '325', '326', '327', '328', '329', '330', '331', '332', '333', '334', '335', '336', '337', '338', '339', '340', '341', '342', '343', '344', '345', '346', '347', '348', '349', '350', '351', '352', '353', '354', '355', '356', '357', '358', '359', '360', '361', '362', '363', '364', '365']
['January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'January', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'February', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'May', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'June', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'July', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'August', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'September', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'October', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'November', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December', 'December']
For your edit I would use the following:
import calendar
input_dates = ['2014-01-01', '2014-01-02', '2014-02-03', '2014-02-04', '2014-05-05', '2014-05-06', '2014-05-07', '2014-05-08']
dates = [datetime.datetime.strptime(str(x),"%Y-%m-%d") for x in input_dates]
seen = set()
for start in dates:
if not (start.year, start.month) in seen:
mon = datetime.datetime(start.year, start.month, 1)
year_day = mon.strftime("%j")
days = calendar.monthrange(mon.year,mon.month)[1]
print("{} {} {}".format(start.strftime("%B"), mon.strftime("%j"), days+int(year_day)))
seen.add((start.year,start.month))
January 001 32
February 032 60
May 121 152
Upvotes: 1
Reputation: 13458
import calendar
from datetime import date
from dateutil.relativedelta import relativedelta
start = date(2012,1,1)
end = date(2015,1,1)
while start < end:
first_delta = (start - date(start.year, 1, 1)).days + 1
last_delta = (start + relativedelta(days=-1, months=1) - date(start.year, 1, 1)).days + 1
print calendar.month_name[start.month], '%02d' % first_delta, last_delta
start += relativedelta(months=1)
Ouput:
January 01 31
February 32 60
March 61 91
...
Upvotes: 4