Python Pandas: pandas.to_datetime () переключает день и месяц, когда день меньше 13 - PullRequest
0 голосов
/ 16 мая 2018

Я написал код, который читает несколько файлов, однако в некоторых моих файлах дата и время меняются на день и месяц, когда день меньше 13, и любой день, который начинается с 13 или выше, т.е. 13/06/11, остается верным ( ДД / ММ / ГГ). Я пытался это исправить, но это не сработало.

Мой фрейм данных выглядит так: Фактическая дата - с 12 июня 2015 по 13 июня 2015 когда я читаю свой столбец даты и времени как строку, даты остаются правильными дд / мм / гггг

tmp                     p1 p2 
11/06/2015 00:56:55.060  0  1
11/06/2015 04:16:38.060  0  1
12/06/2015 16:13:30.060  0  1
12/06/2015 21:24:03.060  0  1
13/06/2015 02:31:44.060  0  1
13/06/2015 02:37:49.060  0  1

но когда я изменяю тип моего столбца на столбец datetime, он меняет мой день и месяц на каждый день, который меньше 13.

выход:

print(df)
tmp                  p1 p2 
06/11/2015 00:56:55  0  1
06/11/2015 04:16:38  0  1
06/12/2015 16:13:30  0  1
06/12/2015 21:24:03  0  1
13/06/2015 02:31:44  0  1
13/06/2015 02:37:49  0  1

Вот мой код:

Я перебираю файлы:

df = pd.read_csv(PATH+file, header = None,error_bad_lines=False , sep = '\t')

затем, когда мой код заканчивает чтение всех моих файлов, я объединяю их, проблема в том, что мой столбец datetime должен быть в типе datetime, поэтому, когда я меняю его тип на pd_datetime (), он меняет день и месяц, когда день менее чем 13.

После преобразования моего столбца datetime даты будут правильными (тип строки)

print(tmp) # as a result I get 11.06.2015 12:56:05 (11june2015)

Но когда я изменяю тип столбца, я получаю это:

tmp = pd.to_datetime(tmp, unit = "ns")
tmp = temps_absolu.apply(lambda x: x.replace(microsecond=0))
print(tmp) # I get 06-11-2016 12:56:05 (06november2015 its not the right date)

Вопрос в том, какую команду я должен использовать или изменить, чтобы остановить смену дня и месяца, когда день меньше 13?

UPDATE Эта команда меняет все дни и месяцы моей колонки

tmp =  pd.to_datetime(tmp, unit='s').dt.strftime('%#m/%#d/%Y %H:%M:%S') 

Итак, чтобы поменять местами только неправильные даты, я написал условие:

for t in tmp:
        if (t.day < 13):
            t = datetime(year=t.year, month=t.day, day=t.month, hour=t.hour, minute=t.minute, second = t.second)

Но это тоже не работает

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я решил свою проблему, но в методе, занимающем много памяти, я сначала разбил свой столбец tmp на столбцы даты и времени, а затем заново разделил свой столбец даты на день, месяц и год, чтобы я мог искать те дни, которые меньше 13 и заменить их соответствующим месяцем

df['tmp'] = pd.to_datetime(df['tmp'], unit='ns')
df['tmp'] = df['tmp'].apply(lambda x: x.replace(microsecond=0))
df['date'] = [d.date() for d in df['tmp']]
df['time'] = [d.time() for d in df['tmp']]
df[['year','month','day']] = df['date'].apply(lambda x: pd.Series(x.strftime("%Y-%m-%d").split("-")))

df['day'] = pd.to_numeric(df['day'], errors='coerce')
df['month'] = pd.to_numeric(df['month'], errors='coerce')
df['year'] = pd.to_numeric(df['year'], errors='coerce')


#Loop to look for days less than 13 and then swap the day and month
for index, d in enumerate(df['day']):
        if(d <13): 
 df.loc[index,'day'],df.loc[index,'month']=df.loc[index,'month'],df.loc[index,'day'] 

# преобразовать серию в строковый тип, чтобы объединить их

 df['day'] = df['day'].astype(str)
 df['month'] = df['month'].astype(str)
 df['year'] = df['year'].astype(str)
 df['date']=  pd.to_datetime(df[['year', 'month', 'day']])
 df['date'] = df['date'].astype(str)
 df['time'] = df['time'].astype(str)

# время слияния, дата и результат в нашем столбце

df['tmp'] =pd.to_datetime(df['date']+ ' '+df['time'])

# удалить добавленные столбцы

df.drop(df[['date','year', 'month', 'day','time']], axis=1, inplace = True)
0 голосов
/ 16 мая 2018

Вы можете использовать параметр dayfirst в pd.to_datetime.

pd.to_datetime(df.tmp, dayfirst=True)

Выход:

0   2015-06-11 00:56:55
1   2015-06-11 04:16:38
2   2015-06-12 16:13:30
3   2015-06-12 21:24:03
4   2015-06-13 02:31:44
5   2015-06-13 02:37:49
Name: tmp, dtype: datetime64[ns]
...