Skip to content

Commit 1082362

Browse files
committed
BUG: weekly and business daily unit support #1150
1 parent c807f81 commit 1082362

File tree

5 files changed

+128
-103
lines changed

5 files changed

+128
-103
lines changed

pandas/src/datetime.pxd

+24-21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
from numpy cimport int64_t
22
from cpython cimport PyObject
33

4+
5+
cdef extern from "stdint.h":
6+
enum: INT64_MIN
7+
enum: INT32_MIN
8+
9+
10+
411
cdef extern from "datetime.h":
512

613
ctypedef class datetime.date [object PyDateTime_Date]:
@@ -128,36 +135,32 @@ cdef extern from "period.h":
128135

129136
ctypedef int64_t (*freq_conv_func)(int64_t, char, asfreq_info*)
130137

131-
int64_t asfreq(int64_t dtordinal, int freq1, int freq2, char relation) except -1
132-
freq_conv_func get_asfreq_func(int fromFreq, int toFreq, int forConvert)
138+
int64_t asfreq(int64_t dtordinal, int freq1, int freq2, char relation) except INT32_MIN
139+
freq_conv_func get_asfreq_func(int fromFreq, int toFreq)
133140
void get_asfreq_info(int fromFreq, int toFreq, asfreq_info *af_info)
134141

135142
int64_t get_period_ordinal(int year, int month, int day,
136143
int hour, int minute, int second,
137-
int freq) except -1
144+
int freq) except INT32_MIN
138145

139-
int64_t get_python_ordinal(int64_t period_ordinal, int freq) except -1
146+
int64_t get_python_ordinal(int64_t period_ordinal, int freq) except INT32_MIN
140147

141148
char *skts_strftime(int64_t value, int freq, PyObject *args)
142149
char *period_to_string(int64_t value, int freq)
143150
char *period_to_string2(int64_t value, int freq, char *fmt)
144151

145-
int get_date_info(int64_t ordinal, int freq, date_info *dinfo) except -1
152+
int get_date_info(int64_t ordinal, int freq, date_info *dinfo) except INT32_MIN
146153
double getAbsTime(int, int64_t, int64_t)
147154

148-
int pyear(int64_t ordinal, int freq) except -1
149-
int pqyear(int64_t ordinal, int freq) except -1
150-
int pquarter(int64_t ordinal, int freq) except -1
151-
int pmonth(int64_t ordinal, int freq) except -1
152-
int pday(int64_t ordinal, int freq) except -1
153-
int pweekday(int64_t ordinal, int freq) except -1
154-
int pday_of_week(int64_t ordinal, int freq) except -1
155-
int pday_of_year(int64_t ordinal, int freq) except -1
156-
int pweek(int64_t ordinal, int freq) except -1
157-
int phour(int64_t ordinal, int freq) except -1
158-
int pminute(int64_t ordinal, int freq) except -1
159-
int psecond(int64_t ordinal, int freq) except -1
160-
161-
cdef extern from "stdint.h":
162-
enum: INT64_MIN
163-
155+
int pyear(int64_t ordinal, int freq) except INT32_MIN
156+
int pqyear(int64_t ordinal, int freq) except INT32_MIN
157+
int pquarter(int64_t ordinal, int freq) except INT32_MIN
158+
int pmonth(int64_t ordinal, int freq) except INT32_MIN
159+
int pday(int64_t ordinal, int freq) except INT32_MIN
160+
int pweekday(int64_t ordinal, int freq) except INT32_MIN
161+
int pday_of_week(int64_t ordinal, int freq) except INT32_MIN
162+
int pday_of_year(int64_t ordinal, int freq) except INT32_MIN
163+
int pweek(int64_t ordinal, int freq) except INT32_MIN
164+
int phour(int64_t ordinal, int freq) except INT32_MIN
165+
int pminute(int64_t ordinal, int freq) except INT32_MIN
166+
int psecond(int64_t ordinal, int freq) except INT32_MIN

pandas/src/datetime.pyx

+8-5
Original file line numberDiff line numberDiff line change
@@ -1295,6 +1295,9 @@ cpdef int64_t period_asfreq(int64_t period_ordinal, int freq1, int64_t mult1,
12951295
retval = asfreq(period_ordinal, freq1, freq2, START)
12961296
retval = apply_mult(retval, mult2)
12971297

1298+
if retval == INT32_MIN:
1299+
raise ValueError('Frequency conversion failed')
1300+
12981301
return retval
12991302

13001303
def period_asfreq_arr(ndarray[int64_t] arr, int freq1, int64_t mult1,
@@ -1314,7 +1317,7 @@ def period_asfreq_arr(ndarray[int64_t] arr, int freq1, int64_t mult1,
13141317
n = len(arr)
13151318
result = np.empty(n, dtype=np.int64)
13161319

1317-
func = get_asfreq_func(freq1, freq2, 0)
1320+
func = get_asfreq_func(freq1, freq2)
13181321
get_asfreq_info(freq1, freq2, &finfo)
13191322

13201323
if end:
@@ -1368,9 +1371,9 @@ def period_ordinal_to_string(int64_t value, int freq, int64_t mult):
13681371
ptr = period_to_string(remove_mult(value, mult), freq)
13691372

13701373
if ptr == NULL:
1371-
raise ValueError("Could not create string from ordinal '%d'" % value)
1374+
raise ValueError("Could not create string from ordinal '%s'" % value)
13721375

1373-
return <object>ptr
1376+
return <object> ptr
13741377

13751378
def period_strftime(int64_t value, int freq, int64_t mult, object fmt):
13761379
cdef:
@@ -1382,11 +1385,11 @@ def period_strftime(int64_t value, int freq, int64_t mult, object fmt):
13821385
if ptr == NULL:
13831386
raise ValueError("Could not create string with fmt '%s'" % fmt)
13841387

1385-
return <object>ptr
1388+
return <object> ptr
13861389

13871390
# period accessors
13881391

1389-
ctypedef int (*accessor)(int64_t ordinal, int freq) except -1
1392+
ctypedef int (*accessor)(int64_t ordinal, int freq) except INT32_MIN
13901393

13911394
def get_period_field(int code, int64_t value, int freq,
13921395
int64_t mult):

0 commit comments

Comments
 (0)