pd.to_datetime nie przestrzega formatu

głosy
1

Mam następujący dataframe:

    month     value
0   1949-01    3
1   1949-02    4
2   1949-03    5

df['month'] = pd.to_datetime(df['month'], format= '%Y/%m')

Chciałbym uzyskać miesiąc w następującym formacie:

 1949/01

Ale wyjście jest zawsze w ten sposób:

   month        value
0   1949-01-01    3
1   1949-02-01    4
2   1949-03-01    5

Dlaczego to automatycznie dodać dni i nie respektować formatu?

Utwórz 20/09/2018 o 00:23
użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

To format, który działa z pandy datetime. Jeśli chcesz, możesz przekształcić ten format datetime przy użyciudt.strftime

df['month'] = df['month'].dt.strftime('%Y/%m')

Czy można wziąć łatwiejszy podejście zacząć i po prostu korzystać z funkcji mapowania, nie ma potrzeby, aby wziąć udział w formacie datetime

df['month'] = df['month'].map(lambda x: x.replace('-', '/'))
Odpowiedział 20/09/2018 o 00:52
źródło użytkownik

głosy
0

Myślę, że są mylące, w jaki sposób informacje są przechowywane (z „dtype”) i jak to jest widoczne dla Ciebie. Poniższy przykład ilustruje ten kod:

import pandas as pd

# create sample dataframe where month is a string
df = pd.DataFrame({'month_str':['1949-01', '1949-02', '1949-03']})

# now create a new column where you have converted the string to a datetime
df['month_datetime'] = pd.to_datetime(df['month_str'])

# now convert the datetime back to a string with your desired format
df['month_new_str'] = df['month_datetime'].dt.strftime('%Y/%m')

# skip all the fooling around with datetimes and just manipulate it as a string directly

df['month_new_str2'] = df['month_str'].apply(lambda x: x.replace('-', '/'))

print(df.dtypes)
print(df)

Wynika to w następujący wynik:

month_str                 object
month_datetime    datetime64[ns]
month_new_str             object
month_new_str2            object
dtype: object
  month_str month_datetime month_new_str month_new_str2
0   1949-01     1949-01-01       1949/01        1949/01
1   1949-02     1949-02-01       1949/02        1949/02
2   1949-03     1949-03-01       1949/03        1949/03

Zauważ, że oryginalny „month_str” kolumna ma dtype obiektu (jest to ciąg znaków). Kiedy zadzwoniłeś to_datetime przekonwertowaliśmy go do typu datetime (bez konieczności określenia formatu, pandy figury to). Ale gdy wyświetlane, pandy wyświetla ją jako pełną datą (dlatego widzisz pole dzień). Jak @sds zwraca uwagę, jeśli tylko chcą, aby przełączyć się na kreskę ukośnikiem następnie można po prostu manipulować oryginalny ciąg do produkcji nowy ciąg ( „month_new_str2”).

Odpowiedział 20/09/2018 o 08:24
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more