@@ -1991,7 +1991,7 @@ def test_unimplemented_dtypes_table_columns(self):
19911991 # this fails because we have a date in the object block......
19921992 self .assertRaises (TypeError , store .append , 'df_unimplemented' , df )
19931993
1994- def test_append_with_timezones (self ):
1994+ def test_append_with_timezones_pytz (self ):
19951995
19961996 from datetime import timedelta
19971997
@@ -2020,7 +2020,8 @@ def compare(a,b):
20202020 compare (store .select ('df_tz' ,where = Term ('A>=df.A[3]' )),df [df .A >= df .A [3 ]])
20212021
20222022 _maybe_remove (store , 'df_tz' )
2023- df = DataFrame (dict (A = Timestamp ('20130102' ,tz = 'US/Eastern' ), B = Timestamp ('20130103' ,tz = 'US/Eastern' )),index = range (5 ))
2023+ # ensure we include dates in DST and STD time here.
2024+ df = DataFrame (dict (A = Timestamp ('20130102' ,tz = 'US/Eastern' ), B = Timestamp ('20130603' ,tz = 'US/Eastern' )),index = range (5 ))
20242025 store .append ('df_tz' ,df )
20252026 result = store ['df_tz' ]
20262027 compare (result ,df )
@@ -2057,6 +2058,78 @@ def compare(a,b):
20572058 result = store .select ('df' )
20582059 assert_frame_equal (result ,df )
20592060
2061+ def test_append_with_timezones_dateutil (self ):
2062+
2063+ from datetime import timedelta
2064+
2065+ try :
2066+ import dateutil
2067+ except ImportError :
2068+ raise nose .SkipTest
2069+
2070+ def compare (a , b ):
2071+ tm .assert_frame_equal (a , b )
2072+
2073+ # compare the zones on each element
2074+ for c in a .columns :
2075+ for i in a .index :
2076+ a_e = a [c ][i ]
2077+ b_e = b [c ][i ]
2078+ if not (a_e == b_e and a_e .tz == b_e .tz ):
2079+ raise AssertionError ("invalid tz comparsion [%s] [%s]" % (a_e , b_e ))
2080+
2081+ # as columns
2082+ with ensure_clean_store (self .path ) as store :
2083+
2084+ _maybe_remove (store , 'df_tz' )
2085+ df = DataFrame (dict (A = [ Timestamp ('20130102 2:00:00' , tz = dateutil .tz .gettz ('US/Eastern' )) + timedelta (hours = 1 ) * i for i in range (5 ) ]))
2086+ store .append ('df_tz' , df , data_columns = ['A' ])
2087+ result = store ['df_tz' ]
2088+ compare (result , df )
2089+ assert_frame_equal (result , df )
2090+
2091+ # select with tz aware
2092+ compare (store .select ('df_tz' , where = Term ('A>=df.A[3]' )), df [df .A >= df .A [3 ]])
2093+
2094+ _maybe_remove (store , 'df_tz' )
2095+ # ensure we include dates in DST and STD time here.
2096+ df = DataFrame (dict (A = Timestamp ('20130102' , tz = dateutil .tz .gettz ('US/Eastern' )), B = Timestamp ('20130603' , tz = dateutil .tz .gettz ('US/Eastern' ))), index = range (5 ))
2097+ store .append ('df_tz' , df )
2098+ result = store ['df_tz' ]
2099+ compare (result , df )
2100+ assert_frame_equal (result , df )
2101+
2102+ _maybe_remove (store , 'df_tz' )
2103+ df = DataFrame (dict (A = Timestamp ('20130102' , tz = dateutil .tz .gettz ('US/Eastern' )), B = Timestamp ('20130102' , tz = dateutil .tz .gettz ('EET' ))), index = range (5 ))
2104+ self .assertRaises (TypeError , store .append , 'df_tz' , df )
2105+
2106+ # this is ok
2107+ _maybe_remove (store , 'df_tz' )
2108+ store .append ('df_tz' , df , data_columns = ['A' , 'B' ])
2109+ result = store ['df_tz' ]
2110+ compare (result , df )
2111+ assert_frame_equal (result , df )
2112+
2113+ # can't append with diff timezone
2114+ df = DataFrame (dict (A = Timestamp ('20130102' , tz = dateutil .tz .gettz ('US/Eastern' )), B = Timestamp ('20130102' , tz = dateutil .tz .gettz ('CET' ))), index = range (5 ))
2115+ self .assertRaises (ValueError , store .append , 'df_tz' , df )
2116+
2117+ # as index
2118+ with ensure_clean_store (self .path ) as store :
2119+
2120+ # GH 4098 example
2121+ df = DataFrame (dict (A = Series (lrange (3 ), index = date_range ('2000-1-1' , periods = 3 , freq = 'H' , tz = dateutil .tz .gettz ('US/Eastern' )))))
2122+
2123+ _maybe_remove (store , 'df' )
2124+ store .put ('df' , df )
2125+ result = store .select ('df' )
2126+ assert_frame_equal (result , df )
2127+
2128+ _maybe_remove (store , 'df' )
2129+ store .append ('df' , df )
2130+ result = store .select ('df' )
2131+ assert_frame_equal (result , df )
2132+
20602133 def test_store_timezone (self ):
20612134 # GH2852
20622135 # issue storing datetime.date with a timezone as it resets when read back in a new timezone
0 commit comments