@@ -124,6 +124,21 @@ def df_full():
124
124
)
125
125
126
126
127
+ @pytest .fixture (
128
+ params = [
129
+ datetime .datetime .now (datetime .timezone .utc ),
130
+ datetime .datetime .now (datetime .timezone .min ),
131
+ datetime .datetime .now (datetime .timezone .max ),
132
+ datetime .datetime .strptime ("2019-01-04T16:41:24+0200" , "%Y-%m-%dT%H:%M:%S%z" ),
133
+ datetime .datetime .strptime ("2019-01-04T16:41:24+0215" , "%Y-%m-%dT%H:%M:%S%z" ),
134
+ datetime .datetime .strptime ("2019-01-04T16:41:24-0200" , "%Y-%m-%dT%H:%M:%S%z" ),
135
+ datetime .datetime .strptime ("2019-01-04T16:41:24-0215" , "%Y-%m-%dT%H:%M:%S%z" ),
136
+ ]
137
+ )
138
+ def timezone_aware_date_list (request ):
139
+ return request .param
140
+
141
+
127
142
def check_round_trip (
128
143
df ,
129
144
engine = None ,
@@ -133,6 +148,7 @@ def check_round_trip(
133
148
expected = None ,
134
149
check_names = True ,
135
150
check_like = False ,
151
+ check_dtype = True ,
136
152
repeat = 2 ,
137
153
):
138
154
"""Verify parquet serializer and deserializer produce the same results.
@@ -174,7 +190,11 @@ def compare(repeat):
174
190
actual = read_parquet (path , ** read_kwargs )
175
191
176
192
tm .assert_frame_equal (
177
- expected , actual , check_names = check_names , check_like = check_like
193
+ expected ,
194
+ actual ,
195
+ check_names = check_names ,
196
+ check_like = check_like ,
197
+ check_dtype = check_dtype ,
178
198
)
179
199
180
200
if path is None :
@@ -724,6 +744,21 @@ def test_timestamp_nanoseconds(self, pa):
724
744
df = pd .DataFrame ({"a" : pd .date_range ("2017-01-01" , freq = "1n" , periods = 10 )})
725
745
check_round_trip (df , pa , write_kwargs = {"version" : "2.0" })
726
746
747
+ def test_timezone_aware_index (self , pa , timezone_aware_date_list ):
748
+ idx = 5 * [timezone_aware_date_list ]
749
+ df = pd .DataFrame (index = idx , data = {"index_as_col" : idx })
750
+
751
+ # see gh-36004
752
+ # compare time(zone) values only, skip their class:
753
+ # pyarrow always creates fixed offset timezones using pytz.FixedOffset()
754
+ # even if it was datetime.timezone() originally
755
+ #
756
+ # technically they are the same:
757
+ # they both implement datetime.tzinfo
758
+ # they both wrap datetime.timedelta()
759
+ # this use-case sets the resolution to 1 minute
760
+ check_round_trip (df , pa , check_dtype = False )
761
+
727
762
@td .skip_if_no ("pyarrow" , min_version = "0.17" )
728
763
def test_filter_row_groups (self , pa ):
729
764
# https://github.com/pandas-dev/pandas/issues/26551
@@ -862,3 +897,12 @@ def test_empty_dataframe(self, fp):
862
897
expected = df .copy ()
863
898
expected .index .name = "index"
864
899
check_round_trip (df , fp , expected = expected )
900
+
901
+ def test_timezone_aware_index (self , fp , timezone_aware_date_list ):
902
+ idx = 5 * [timezone_aware_date_list ]
903
+
904
+ df = pd .DataFrame (index = idx , data = {"index_as_col" : idx })
905
+
906
+ expected = df .copy ()
907
+ expected .index .name = "index"
908
+ check_round_trip (df , fp , expected = expected )
0 commit comments