()
| 2531 | @pytest.mark.pandas |
| 2532 | @pytest.mark.timezone_data |
| 2533 | def test_strftime(): |
| 2534 | times = ["2018-03-10 09:00", "2038-01-31 12:23", None] |
| 2535 | timezones = ["CET", "UTC", "Europe/Ljubljana"] |
| 2536 | |
| 2537 | formats = ["%a", "%A", "%w", "%d", "%b", "%B", "%m", "%y", "%Y", "%H", "%I", |
| 2538 | "%p", "%M", "%z", "%Z", "%j", "%U", "%W", "%%", "%G", "%V", "%u"] |
| 2539 | if sys.platform != "win32": |
| 2540 | # Locale-dependent formats don't match on Windows |
| 2541 | formats.extend(["%c", "%x", "%X"]) |
| 2542 | |
| 2543 | for timezone in timezones: |
| 2544 | ts = pd.to_datetime(times).tz_localize(timezone) |
| 2545 | for unit in ["s", "ms", "us", "ns"]: |
| 2546 | tsa = pa.array(ts, type=pa.timestamp(unit, timezone)) |
| 2547 | for fmt in formats: |
| 2548 | options = pc.StrftimeOptions(fmt) |
| 2549 | result = pc.strftime(tsa, options=options) |
| 2550 | # cast to the same type as result to ignore string vs large_string |
| 2551 | expected = pa.array(ts.strftime(fmt)).cast(result.type) |
| 2552 | if sys.platform == "win32" and fmt == "%Z": |
| 2553 | _compare_strftime_strings_on_windows(result, expected) |
| 2554 | else: |
| 2555 | assert result.equals(expected) |
| 2556 | |
| 2557 | fmt = "%Y-%m-%dT%H:%M:%S" |
| 2558 | |
| 2559 | # Default format |
| 2560 | tsa = pa.array(ts, type=pa.timestamp("s", timezone)) |
| 2561 | result = pc.strftime(tsa, options=pc.StrftimeOptions()) |
| 2562 | expected = pa.array(ts.strftime(fmt)).cast(result.type) |
| 2563 | assert result.equals(expected) |
| 2564 | |
| 2565 | # Default format plus timezone |
| 2566 | tsa = pa.array(ts, type=pa.timestamp("s", timezone)) |
| 2567 | result = pc.strftime(tsa, options=pc.StrftimeOptions(fmt + "%Z")) |
| 2568 | expected = pa.array(ts.strftime(fmt + "%Z")).cast(result.type) |
| 2569 | if sys.platform == "win32": |
| 2570 | _compare_strftime_strings_on_windows(result, expected) |
| 2571 | else: |
| 2572 | assert result.equals(expected) |
| 2573 | |
| 2574 | # Pandas %S is equivalent to %S in arrow for unit="s" |
| 2575 | tsa = pa.array(ts, type=pa.timestamp("s", timezone)) |
| 2576 | options = pc.StrftimeOptions("%S") |
| 2577 | result = pc.strftime(tsa, options=options) |
| 2578 | expected = pa.array(ts.strftime("%S")).cast(result.type) |
| 2579 | assert result.equals(expected) |
| 2580 | |
| 2581 | # Pandas %S.%f is equivalent to %S in arrow for unit="us" |
| 2582 | tsa = pa.array(ts, type=pa.timestamp("us", timezone)) |
| 2583 | options = pc.StrftimeOptions("%S") |
| 2584 | result = pc.strftime(tsa, options=options) |
| 2585 | expected = pa.array(ts.strftime("%S.%f")).cast(result.type) |
| 2586 | assert result.equals(expected) |
| 2587 | |
| 2588 | # Test setting locale |
| 2589 | tsa = pa.array(ts, type=pa.timestamp("s", timezone)) |
| 2590 | options = pc.StrftimeOptions(fmt, locale="C") |
nothing calls this directly
no test coverage detected