изменение типа данных столбца с помощью pandas - PullRequest
2 голосов
/ 11 апреля 2020

У меня есть датафрейм со столбцом даты. Столбец включает в себя «пользовательские» и «общие» типы данных. Я хочу изменить все это формат даты и времени. «43891» означает «01.03.2020 00:00:00»

TARİH
28.02.2020  00:00:00 -->custom
28.02.2020  00:00:00 -->custom
28.02.2020  00:00:00 -->custom
43891 -->general
43891 -->general
43891 -->general
.
.

Вот то, что я попробовал ниже, та же проблема со мной (ссылка , меняющая все даты на стандартное время даты в кадре данных )

import pandas as pd
from datetime import datetime, timedelta

def from_excel_ordinal(ordinal, _epoch0=datetime(1899, 12, 31)):
    if ordinal >= 60:
        ordinal -= 1  # Excel leap year bug, 1900 is not a leap year!
    return (_epoch0 + timedelta(days=ordinal)).replace(microsecond=0)

df = pd.read_excel('D:\Documents\Desktop\deneme/deneme1.xlsx', sheet_name='Sheet1')
m = df['TARİH'].astype(str).str.isdigit()

df.loc[m, 'TARİH'] = \
df.loc[m, 'TARİH']\
  .astype(int)\
  .apply(from_excel_ordinal)

df['TARİH'] = pd.to_datetime(df['TARİH'], errors='coerce')

df.to_excel('D:\Documents\Desktop\deneme/deneme1.xlsx',index=False)

Когда я применяю эти коды, я делюсь выводом ниже. Ячейки «общего типа» превращаются в «NaT».

print(df.loc[3280:3286, 'TARİH'])

Output: 
2020-02-28
2020-02-28
2020-02-28
2020-02-28
NaT
NaT
NaT
Name: TARİH, dtype: datetime64[ns]

В этом решении заменяет все даты на стандартное время даты в кадре данных все столбцы имеют тип данных «общий». Благодаря этому проблема решена. Но когда я применяю приведенные выше коды к моему фрейму данных, формат столбца D превращается в формат «дата-время». Из-за этого я получаю ошибку ниже, когда я запускаю коды 2 раза:

TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]

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

Также у меня 3000 строк. Поэтому я не могу применять ручные методы.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

IIU C, 43891 - количество дней с нулевой даты:

# zero_date = 1899-12-29
zero_date = pd.to_datetime('2020-03-01') - pd.to_timedelta(43891, unit='D')

А затем вы можете сделать np.select:

# you need dayfist
custom = pd.to_datetime(df['TARİH'], dayfirst=True, errors='coerce')

# general type
df['TARİH'] = np.where(custom.isna(), df['TARİH'],
                       (custom - zero_date)/pd.to_timedelta('1D')
                      )
0 голосов
/ 11 апреля 2020

На вопрос «1009» нет ответов. В связи с этим я использовал библиотеку "pynput.mouse".

Когда вы изменяете стиль столбца на «короткую дату» с помощью метода контроллера мыши, df ['TARİH'] = pd.to_datetime (df ['TARİH']) этот код выполняется из-за чтобы отсутствовали смешанные даты и массивы переданных целых чисел, весь столбец имеет одинаковый формат.

Если у вас есть pandas или любой другой метод, пожалуйста, ответьте.

from pynput.mouse import Button, Controller
import pandas as pd

#Go to desktop
mouse= Controller ()
mouse.move(1358,751)
mouse.click(Button.left, 1)

#Open folder
mouse.position=(632, 108)
time.sleep(2)
mouse.click(Button.left,2)

#Open excel file
mouse.position=(354, 127)
time.sleep(2)
mouse.click(Button.left,2)

#Select D column in excel
mouse.position=(250, 256)
time.sleep(10)
mouse.click(Button.left,1)

#Go to format cell area
mouse.position=(709, 87)
time.sleep(2)
mouse.click(Button.left,1)

#Change format to short date
mouse.position=(663, 297)
time.sleep(2)
mouse.click(Button.left,1)

#Close excel file
mouse.position=(1337, 11)
time.sleep(2)
mouse.click(Button.left,1)

#Save excel file
mouse.position=(597, 400)
time.sleep(2)
mouse.click(Button.left,1)

#wait till excel close
time.sleep(3)

print("Formula writing operation is starting..")
df = pd.read_excel('D:\Documents\Desktop\deneme/2020 Data_çalışma.xlsx', sheet_name='Sheet1')
df['TARİH'] = pd.to_datetime(df['TARİH'])
print("Formula is written..")


Output:
TARİH
28.02.2020  00:00:00
28.02.2020  00:00:00
28.02.2020  00:00:00
01.03.2020  00:00:00
01.03.2020  00:00:00
01.03.2020  00:00:00
.
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...