diff --git a/doc/source/whatsnew/v0.17.0.txt b/doc/source/whatsnew/v0.17.0.txt index f96a2954f98a2..3d27e840232f7 100644 --- a/doc/source/whatsnew/v0.17.0.txt +++ b/doc/source/whatsnew/v0.17.0.txt @@ -95,3 +95,7 @@ Bug Fixes - Bug where infer_freq infers timerule (WOM-5XXX) unsupported by to_offset (:issue:`9425`) + +- Bug in ``to_csv`` where ``data_format`` is ignored if the ``datetime`` is not +an integral date value (i.e. it is fractional) (:issue:`10209`) + diff --git a/pandas/core/format.py b/pandas/core/format.py index 3ab41ded1deea..429051b5815fa 100644 --- a/pandas/core/format.py +++ b/pandas/core/format.py @@ -2114,7 +2114,7 @@ def _get_format_datetime64_from_values(values, date_format): is_dates_only = _is_dates_only(values) if is_dates_only: return date_format or "%Y-%m-%d" - return None + return date_format class Timedelta64Formatter(GenericArrayFormatter): diff --git a/pandas/tests/test_format.py b/pandas/tests/test_format.py index a7129bca59a7f..4d21190e7a50d 100644 --- a/pandas/tests/test_format.py +++ b/pandas/tests/test_format.py @@ -2449,6 +2449,27 @@ def test_to_csv_decimal(self): expected_float_format = ';col1;col2;col3\n0;1;a;10,10\n' self.assertEqual(df.to_csv(decimal=',',sep=';', float_format = '%.2f'), expected_float_format) + def test_to_csv_date_format(self): + # GH 10209 + df_sec = DataFrame({'A': pd.date_range('20130101',periods=5,freq='s')}) + df_day = DataFrame({'A': pd.date_range('20130101',periods=5,freq='d')}) + + expected_default_sec = ',A\n0,2013-01-01 00:00:00\n1,2013-01-01 00:00:01\n2,2013-01-01 00:00:02' + \ + '\n3,2013-01-01 00:00:03\n4,2013-01-01 00:00:04\n' + self.assertEqual(df_sec.to_csv(), expected_default_sec) + + expected_ymdhms_day = ',A\n0,2013-01-01 00:00:00\n1,2013-01-02 00:00:00\n2,2013-01-03 00:00:00' + \ + '\n3,2013-01-04 00:00:00\n4,2013-01-05 00:00:00\n' + self.assertEqual(df_day.to_csv(date_format='%Y-%m-%d %H:%M:%S'), expected_ymdhms_day) + + expected_ymd_sec = ',A\n0,2013-01-01\n1,2013-01-01\n2,2013-01-01\n3,2013-01-01\n4,2013-01-01\n' + self.assertEqual(df_sec.to_csv(date_format='%Y-%m-%d'), expected_ymd_sec) + + expected_default_day = ',A\n0,2013-01-01\n1,2013-01-02\n2,2013-01-03\n3,2013-01-04\n4,2013-01-05\n' + self.assertEqual(df_day.to_csv(), expected_default_day) + self.assertEqual(df_day.to_csv(date_format='%Y-%m-%d'), expected_default_day) + + class TestSeriesFormatting(tm.TestCase): _multiprocess_can_split_ = True