@@ -1917,131 +1917,73 @@ def test_concat_tz_series_tzlocal(self):
1917
1917
tm .assert_series_equal (result , pd .Series (x + y ))
1918
1918
assert result .dtype == 'datetime64[ns, tzlocal()]'
1919
1919
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 ):
1921
1924
# GH 12396
1922
1925
1923
1926
# 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 ))
1926
1930
1927
1931
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 )
1930
1937
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
- )
1939
1938
assert_frame_equal (result , expected )
1940
1939
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 ):
1948
1943
# GH 12396
1949
1944
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 ])
1961
1948
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 ) }
1964
1951
)
1965
1952
result = pd .concat ([first , second ], axis = 1 )
1966
1953
assert_frame_equal (result , expected )
1967
1954
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 ):
1979
1958
# GH 12396
1980
1959
1981
1960
# 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 )]],
2010
1964
index = [2 , 3 ])
2011
1965
2012
1966
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 )
2015
1971
2016
1972
result = pd .concat ([first , second ])
2017
1973
assert_frame_equal (result , expected )
2018
1974
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
2034
1978
2035
- # mixed tz
2036
1979
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 )]],
2039
1983
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 )])
2045
1987
2046
1988
result = pd .concat ([first , second ], axis = 0 )
2047
1989
assert_frame_equal (result , expected )
@@ -2107,32 +2049,21 @@ def test_concat_empty_series(self):
2107
2049
columns = ['x' , 0 ])
2108
2050
tm .assert_frame_equal (res , exp )
2109
2051
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 ):
2110
2055
# 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 )
2117
2056
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 )
2121
2059
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 })
2125
2064
result = concat ([first , second ], axis = 1 )
2126
2065
assert_frame_equal (result , expected )
2127
2066
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
-
2136
2067
def test_default_index (self ):
2137
2068
# is_series and ignore_index
2138
2069
s1 = pd .Series ([1 , 2 , 3 ], name = 'x' )
0 commit comments