@@ -1917,131 +1917,73 @@ def test_concat_tz_series_tzlocal(self):
19171917 tm .assert_series_equal (result , pd .Series (x + y ))
19181918 assert result .dtype == 'datetime64[ns, tzlocal()]'
19191919
1920- def test_concat_NaT_dataframes_all_NaT_axis_0 (self ):
1920+ @pytest .mark .parametrize ('tz1' , [None , 'UTC' ])
1921+ @pytest .mark .parametrize ('tz2' , [None , 'UTC' ])
1922+ @pytest .mark .parametrize ('s' , [pd .NaT , pd .Timestamp ('20150101' )])
1923+ def test_concat_NaT_dataframes_all_NaT_axis_0 (self , tz1 , tz2 , s ):
19211924 # GH 12396
19221925
19231926 # tz-naive
1924- first = pd .DataFrame ([[pd .NaT ], [pd .NaT ]])
1925- second = pd .DataFrame ([[pd .NaT ]])
1927+ first = pd .DataFrame ([[pd .NaT ], [pd .NaT ]]).apply (
1928+ lambda x : x .dt .tz_localize (tz1 ))
1929+ second = pd .DataFrame ([s ]).apply (lambda x : x .dt .tz_localize (tz2 ))
19261930
19271931 result = pd .concat ([first , second ], axis = 0 )
1928- expected = pd .DataFrame ([pd .NaT , pd .NaT , pd .NaT ], index = [0 , 1 , 0 ])
1929- assert_frame_equal (result , expected )
1932+ expected = pd .DataFrame (pd .Series (
1933+ [pd .NaT , pd .NaT , s ], index = [0 , 1 , 0 ]))
1934+ expected = expected .apply (lambda x : x .dt .tz_localize (tz2 ))
1935+ if tz1 != tz2 :
1936+ expected = expected .astype (object )
19301937
1931- # one side timezone-aware
1932- # upcasts for mixed case
1933- first = pd .DataFrame (pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' ))
1934- result = pd .concat ([first , second ], axis = 0 )
1935- expected = pd .DataFrame (
1936- pd .Series ([pd .NaT , pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' ),
1937- index = [0 , 1 , 0 ]
1938- )
19391938 assert_frame_equal (result , expected )
19401939
1941- # both sides timezone-aware
1942- # upcasts to tz-aware
1943- second = pd .DataFrame (pd .Series ([pd .NaT ]).dt .tz_localize ('UTC' ))
1944- result = pd .concat ([first , second ], axis = 0 )
1945- assert_frame_equal (result , expected )
1946-
1947- def test_concat_NaT_dataframes_all_NaT_axis_1 (self ):
1940+ @pytest .mark .parametrize ('tz1' , [None , 'UTC' ])
1941+ @pytest .mark .parametrize ('tz2' , [None , 'UTC' ])
1942+ def test_concat_NaT_dataframes_all_NaT_axis_1 (self , tz1 , tz2 ):
19481943 # GH 12396
19491944
1950- # tz-naive
1951- first = pd .DataFrame ([[pd .NaT ], [pd .NaT ]])
1952- second = pd .DataFrame ([[pd .NaT ]], columns = [1 ])
1953- expected = pd .DataFrame ([[pd .NaT , pd .NaT ], [pd .NaT , pd .NaT ]],
1954- columns = [0 , 1 ])
1955- result = pd .concat ([first , second ], axis = 1 )
1956- assert_frame_equal (result , expected )
1957-
1958- # one side timezone-aware
1959- # upcasts result to tz-aware
1960- first = pd .DataFrame (pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' ))
1945+ first = pd .DataFrame (pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize (tz1 ))
1946+ second = pd .DataFrame (pd .Series (
1947+ [pd .NaT ]).dt .tz_localize (tz2 ), columns = [1 ])
19611948 expected = pd .DataFrame (
1962- {0 : pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' ),
1963- 1 : pd .Series ([pd .NaT , pd .NaT ])}
1949+ {0 : pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize (tz1 ),
1950+ 1 : pd .Series ([pd .NaT , pd .NaT ]). dt . tz_localize ( tz2 ) }
19641951 )
19651952 result = pd .concat ([first , second ], axis = 1 )
19661953 assert_frame_equal (result , expected )
19671954
1968- # both sides timezone-aware
1969- # upcasts result to tz-aware
1970- second [1 ] = second [1 ].dt .tz_localize ('UTC' )
1971- expected = pd .DataFrame (
1972- {0 : pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' ),
1973- 1 : pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' )}
1974- )
1975- result = pd .concat ([first , second ], axis = 1 )
1976- assert_frame_equal (result , expected )
1977-
1978- def test_concat_NaT_dataframes_mixed_timestamps_and_NaT (self ):
1955+ @pytest .mark .parametrize ('tz1' , [None , 'UTC' ])
1956+ @pytest .mark .parametrize ('tz2' , [None , 'UTC' ])
1957+ def test_concat_NaT_series_dataframe_all_NaT (self , tz1 , tz2 ):
19791958 # GH 12396
19801959
19811960 # tz-naive
1982- first = pd .DataFrame ([[pd .NaT ], [pd .NaT ]])
1983- second = pd .DataFrame ([[pd .Timestamp ('2015/01/01' )],
1984- [pd .Timestamp ('2016/01/01' )]],
1985- index = [2 , 3 ])
1986- expected = pd .DataFrame ([pd .NaT , pd .NaT ,
1987- pd .Timestamp ('2015/01/01' ),
1988- pd .Timestamp ('2016/01/01' )])
1989-
1990- result = pd .concat ([first , second ], axis = 0 )
1991- assert_frame_equal (result , expected )
1992-
1993- # one side timezone-aware
1994- second = second [0 ].dt .tz_localize ('UTC' )
1995- expected = pd .DataFrame (
1996- pd .Series ([pd .NaT , pd .NaT ,
1997- pd .Timestamp ('2015/01/01' ),
1998- pd .Timestamp ('2016/01/01' )]).dt .tz_localize ('UTC' )
1999- )
2000- result = pd .concat ([first , second ], axis = 0 )
2001- assert_frame_equal (result , expected )
2002-
2003- def test_concat_NaT_series_dataframe_all_NaT (self ):
2004- # GH 12396
2005-
2006- # tz-naive
2007- first = pd .Series ([pd .NaT , pd .NaT ])
2008- second = pd .DataFrame ([[pd .Timestamp ('2015/01/01' )],
2009- [pd .Timestamp ('2016/01/01' )]],
1961+ first = pd .Series ([pd .NaT , pd .NaT ]).dt .tz_localize (tz1 )
1962+ second = pd .DataFrame ([[pd .Timestamp ('2015/01/01' , tz = tz2 )],
1963+ [pd .Timestamp ('2016/01/01' , tz = tz2 )]],
20101964 index = [2 , 3 ])
20111965
20121966 expected = pd .DataFrame ([pd .NaT , pd .NaT ,
2013- pd .Timestamp ('2015/01/01' ),
2014- pd .Timestamp ('2016/01/01' )])
1967+ pd .Timestamp ('2015/01/01' , tz = tz2 ),
1968+ pd .Timestamp ('2016/01/01' , tz = tz2 )])
1969+ if tz1 != tz2 :
1970+ expected = expected .astype (object )
20151971
20161972 result = pd .concat ([first , second ])
20171973 assert_frame_equal (result , expected )
20181974
2019- # one side timezone-aware
2020- second [0 ] = second [0 ].dt .tz_localize ('UTC' )
2021- result = pd .concat ([first , second ])
2022-
2023- expected = pd .DataFrame (
2024- pd .Series ([pd .NaT , pd .NaT ,
2025- pd .Timestamp ('2015/01/01' ),
2026- pd .Timestamp ('2016/01/01' )]).dt .tz_localize ('UTC' )
2027- )
2028- assert_frame_equal (result , expected )
2029-
2030- # both sides timezone-aware
2031- first = first .dt .tz_localize ('UTC' )
2032- result = pd .concat ([first , second ])
2033- assert_frame_equal (result , expected )
1975+ @pytest .mark .parametrize ('tz' , [None , 'UTC' ])
1976+ def test_concat_NaT_dataframes (self , tz ):
1977+ # GH 12396
20341978
2035- # mixed tz
20361979 first = pd .DataFrame ([[pd .NaT ], [pd .NaT ]])
2037- second = pd .DataFrame ([[pd .Timestamp ('2015/01/01' , tz = 'UTC' )],
2038- [pd .Timestamp ('2016/01/01' , tz = 'US/Eastern' )]],
1980+ first = first .apply (lambda x : x .dt .tz_localize (tz ))
1981+ second = pd .DataFrame ([[pd .Timestamp ('2015/01/01' , tz = tz )],
1982+ [pd .Timestamp ('2016/01/01' , tz = tz )]],
20391983 index = [2 , 3 ])
2040-
2041- expected = pd .DataFrame ([pd .NaT ,
2042- pd .NaT ,
2043- pd .Timestamp ('2015/01/01' , tz = 'UTC' ),
2044- pd .Timestamp ('2016/01/01' , tz = 'US/Eastern' )])
1984+ expected = pd .DataFrame ([pd .NaT , pd .NaT ,
1985+ pd .Timestamp ('2015/01/01' , tz = tz ),
1986+ pd .Timestamp ('2016/01/01' , tz = tz )])
20451987
20461988 result = pd .concat ([first , second ], axis = 0 )
20471989 assert_frame_equal (result , expected )
@@ -2107,32 +2049,21 @@ def test_concat_empty_series(self):
21072049 columns = ['x' , 0 ])
21082050 tm .assert_frame_equal (res , exp )
21092051
2052+ @pytest .mark .parametrize ('tz' , [None , 'UTC' ])
2053+ @pytest .mark .parametrize ('values' , [[], [1 , 2 , 3 ]])
2054+ def test_concat_empty_series_timelike (self , tz , values ):
21102055 # GH 18447
2111- # tz-naive
2112- first = Series (pd .to_datetime ([], utc = False ))
2113- second = Series ([1 , 2 , 3 ])
2114- expected = DataFrame ([[pd .NaT , 1 ], [pd .NaT , 2 ], [pd .NaT , 3 ]])
2115- result = concat ([first , second ], axis = 1 )
2116- assert_frame_equal (result , expected )
21172056
2118- # timezone-aware
2119- first = Series (pd .to_datetime ([], utc = True ))
2120- second = Series ([1 , 2 , 3 ])
2057+ first = Series ([], dtype = 'M8[ns]' ).dt .tz_localize (tz )
2058+ second = Series (values )
21212059 expected = DataFrame (
2122- {0 : pd .Series ([pd .NaT , pd .NaT , pd .NaT ]).dt .tz_localize ('UTC' ),
2123- 1 : pd .Series ([1 , 2 , 3 ])}
2124- )
2060+ {0 : pd .Series ([pd .NaT ] * len (values ),
2061+ dtype = 'M8[ns]'
2062+ ).dt .tz_localize (tz ),
2063+ 1 : values })
21252064 result = concat ([first , second ], axis = 1 )
21262065 assert_frame_equal (result , expected )
21272066
2128- # both empty
2129- first = Series (pd .to_datetime ([], utc = True ))
2130- second = Series ([])
2131- result = concat ([first , second ], axis = 1 )
2132- assert result .size == 0
2133- assert result .dtypes [0 ] == 'datetime64[ns, UTC]'
2134- assert result .dtypes [1 ] == 'float64'
2135-
21362067 def test_default_index (self ):
21372068 # is_series and ignore_index
21382069 s1 = pd .Series ([1 , 2 , 3 ], name = 'x' )
0 commit comments