forked from pandas-dev/pandas
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstrftime.py
128 lines (97 loc) · 4.21 KB
/
strftime.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
import numpy as np
import pandas as pd
from pandas import offsets
class DatetimeStrftime:
timeout = 1500
params = [1000, 10000]
param_names = ["obs"]
def setup(self, obs):
d = "2018-11-29"
dt = "2018-11-26 11:18:27.0"
self.data = pd.DataFrame(
{
"dt": [np.datetime64(dt)] * obs,
"d": [np.datetime64(d)] * obs,
"r": [np.random.uniform()] * obs,
}
)
def time_frame_date_to_str(self, obs):
self.data["d"].astype(str)
def time_frame_date_formatting_default(self, obs):
self.data["d"].dt.strftime(date_format="%Y-%m-%d")
def time_frame_date_formatting_custom(self, obs):
self.data["d"].dt.strftime(date_format="%Y---%m---%d")
def time_frame_datetime_to_str(self, obs):
self.data["dt"].astype(str)
def time_frame_datetime_formatting_default(self, obs):
self.data["dt"].dt.strftime(date_format=None)
def time_frame_datetime_formatting_default_explicit_date_only(self, obs):
self.data["dt"].dt.strftime(date_format="%Y-%m-%d")
def time_frame_datetime_formatting_default_explicit(self, obs):
self.data["dt"].dt.strftime(date_format="%Y-%m-%d %H:%M:%S")
def time_frame_datetime_formatting_default_with_float(self, obs):
self.data["dt"].dt.strftime(date_format="%Y-%m-%d %H:%M:%S.%f")
def time_frame_datetime_formatting_custom(self, obs):
self.data["dt"].dt.strftime(date_format="%Y-%m-%d --- %H:%M:%S")
class PeriodStrftime:
timeout = 1500
params = ([1000, 10000], ["D", "H"])
param_names = ["obs", "fq"]
def setup(self, obs, fq):
self.data = pd.DataFrame(
{
"p": pd.period_range(start="2000-01-01", periods=obs, freq=fq),
"r": [np.random.uniform()] * obs,
}
)
def time_frame_period_to_str(self, obs, fq):
self.data["p"].astype(str)
def time_frame_period_formatting_default(self, obs, fq):
"""Note that as opposed to datetimes, the default format of periods are
many and depend from the period characteristics, so we have almost no chance
to reach the same level of performance if a 'default' format string is
explicitly provided by the user. See
time_frame_datetime_formatting_default_explicit above."""
self.data["p"].dt.strftime(date_format=None)
def time_frame_period_formatting_index_default(self, obs, fq):
self.data.set_index("p").index.format()
def time_frame_period_formatting_custom(self, obs, fq):
self.data["p"].dt.strftime(date_format="%Y-%m-%d --- %H:%M:%S")
def time_frame_period_formatting_iso8601_strftime_Z(self, obs, fq):
self.data["p"].dt.strftime(date_format="%Y-%m-%dT%H:%M:%SZ")
def time_frame_period_formatting_iso8601_strftime_offset(self, obs, fq):
"""Not optimized yet as %z is not supported by `convert_strftime_format`"""
self.data["p"].dt.strftime(date_format="%Y-%m-%dT%H:%M:%S%z")
class BusinessHourStrftime:
timeout = 1500
params = [1000, 10000]
param_names = ["obs"]
def setup(self, obs):
self.data = pd.DataFrame(
{
"off": [offsets.BusinessHour()] * obs,
}
)
def time_frame_offset_str(self, obs):
self.data["off"].apply(str)
def time_frame_offset_repr(self, obs):
self.data["off"].apply(repr)
if __name__ == "__main__":
# A __main__ to easily debug this script
for cls in (DatetimeStrftime, PeriodStrftime, BusinessHourStrftime):
all_params = dict()
all_p_values = cls.params
if len(cls.param_names) == 1:
all_p_values = (all_p_values,)
for p_name, p_values in zip(cls.param_names, all_p_values):
all_params[p_name] = p_values
from itertools import product
for case in product(*all_params.values()):
p_dict = {p_name: p_val for p_name, p_val in zip(all_params.keys(), case)}
print(f"{cls.__name__} - {p_dict}")
o = cls()
o.setup(**p_dict)
for m_name, m in cls.__dict__.items():
if callable(m):
print(m_name)
m(o, **p_dict)