Преобразование индекса строки Python в дату и время - PullRequest
0 голосов
/ 28 января 2019

Я импортирую некоторые данные, в которых есть один столбец для даты, а другой для часа.Я хотел бы объединить их в один столбец DateTime.

Я использовал

df2 = pd.read_csv(csv_file_path,
              parse_dates=[['Date', 'Hour']],
              infer_datetime_format=True)

, который возвратил

      Date_Hour    Unnamed: 0      Data
0   2018-01-01 0         3         51.29
1   2018-01-01 1         4         43.59    
2   2018-01-01 2         5         93.60    
3   2018-01-01 3         6         54.78    
4   2018-01-01 4         7         14.35

, но столбец Date_Hour не в формате DateTime, и когда я пытаюсь преобразовать его, я получаюошибка

df2.set_index('Date_Hour', inplace=True)
pd.to_datetime(df2.index)

дает

ValueError: ('Unknown string format:', '2018-01-01 0')

Я также пытался использовать

pd.to_datetime(prices.index, format='%y-%m-%d %H')

Данные, которые я импортировал, выглядят так;

 ,Date,Hour,Data
3,2018-01-01,0,51.29
4,2018-01-01,1,43.59
5,2018-01-01,2,93.60
6,2018-01-01,3,54.78
7,2018-01-01,4,14.35
8,2018-01-01,5,18.60

И я бы хотел, чтобы результат был

                          Data
 Date_Hour
2018-01-01 00:00         51.29
2018-01-01 01:00         43.59  
2018-01-01 02:00         93.60  
2018-01-01 03:00         54.78  
2018-01-01 04:00         14.35

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Редактировать: несколько ответов значительно улучшился мой первый треск на этом.Я собираюсь оставить это, поскольку на него есть ссылка в другом ответе.

Давайте начнем с установки даты в тип datetime.

df["Date"] = pd.to_datetime(df["Date"], unit="ms")

Мы хотим добавить к этому часы, чтобы онидолжно быть Timedelta.

df["Hour"] = df["Hour"].apply(lambda x: pd.Timedelta(hours=int(x)))

Теперь простая сумма:

df["Date_hour"] = df["Date"] + df["Hour"]

Установите индекс даты и времени так же, как и любой другой столбец типа datetime:

df = df.set_index("Date_hour")
0 голосов
/ 28 января 2019

Шарль Ландау был близок.Просто некоторые изменения

df

      sr          Date  Hour     Data
0      3    2018-01-01     0    51.29
1      4    2018-01-01     1    43.59
2      5    2018-01-01     2    93.60
3      6    2018-01-01     3    54.78
4      7    2018-01-01     4    14.35
5      8    2018-01-01     5    18.60


df["Date"] = pd.to_datetime(df["Date"], unit="ns")
df["Hour"] = pd.to_timedelta(df["Hour"])
df["Date_Hour"]=(df["Date"] + df["Hour"]).dt.strftime('%Y-%m-%d %H:%M')
df.set_index("Date_Hour")

                    sr        Date  Hour     Data
       Date_Hour                
2018-01-01 00:00     3  2018-01-01     0    51.29
2018-01-01 01:00     4  2018-01-01     1    43.59
2018-01-01 02:00     5  2018-01-01     2    93.60
2018-01-01 03:00     6  2018-01-01     3    54.78
2018-01-01 04:00     7  2018-01-01     4    14.35
2018-01-01 05:00     8  2018-01-01     5    18.60
0 голосов
/ 28 января 2019

В данном конкретном случае недостающий ведущий 0 часа проблематичен.Вы можете избежать этого импорта без анализа до datetime, а затем с помощью zfill перед анализом до datetime:

df2 = pd.read_csv(csv_file_path)
df2.index = pd.to_datetime(df2.Date + df2.Hour.astype(str).str.zfill(2), format='%Y-%m-%d%H')

Чтобы удалить столбцы Date и Hour после их анализа:

df2.drop(['Date' ,'Hour'], axis=1, inplace=True)

Краткое объяснение:
zfill дополнит числовую строку нулями до указанного количества символов.

Конечно, вы также можете указать date_parser для pd.read_csv, но в этом случае имхо гораздо яснее и питоннее разбирать даты после прочтения csv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...