Как отформатировать все даты в листе от Pandas? - PullRequest
0 голосов
/ 01 ноября 2018

У меня были следующие данные листа в файле Excel:

id   data_1                 data_2
1    2018/11/11 00:00       123
2    123                    2018/11/2 00:00

Дата в Excel на самом деле является плавающей точкой, поэтому я хочу изменить ее на str, используя следующий синтаксис:

df = df.astype(dtype=str)

Но панды меняют формат даты YYYY/MM/DD на YYYY-MM-DD, поэтому я получаю это в выводе:

id   data_1                 data_2
1    2018-11-11 00:00       123
2    123                    2018-11-2 00:00

Как изменить все даты на str и сохранить их в формате YYYY/MM/DD?

Я не могу использовать df.to_datetime() или какой-либо синтаксис, подобный этому, потому что не все даты находятся в определенном столбце. И я не хочу проходить по всем столбцам для достижения этого.

Единственный способ, которым я знаю, это использовать регулярные выражения:

df.replace(['((?<=[0-9]{4})-(?=([0-9]{2}-[0-9]{2})))|((?<=[0-9]{4}-[0-9]{2})-(?=[0-9]{2}))'], ['/'], regex=True)

Но это приведет к ошибкам, пока у меня есть данные YYYY-MM-DD в некоторых других данных str.

Я хочу изменить только тип даты на листе, и df.astype может это сделать. Единственная проблема - я хочу YYYY/MM/DD вместо YYYY-MM-DD.

В общем, я хочу изменить все даты в листе на тип ул. И отформатируйте его в YYYY/MM/DD HH:MM:SS. astype может достичь первого шага.

Есть ли простой и быстрый способ добиться этого?

Думаю, что вы читаете.

1 Ответ

0 голосов
/ 01 ноября 2018

считают, что у вас есть фрейм данных с объектами datetime, но также и случайными целыми числами:

df = pd.DataFrame(pd.date_range(dt.datetime(2018,1,1), dt.datetime(2018,1,6)))
df[0][0] = 123
print(df)
    0
0   123
1   2018-01-02
2   2018-01-03
3   2018-01-04
4   2018-01-05
5   2018-01-06

теперь вы можете создать новый столбец с датой и временем в нужном формате, используя df.apply и эту функцию convert:

def convert(x):
    try:
        return x.strftime('%Y/%m/%d')
    except AttributeError:
        return str(x)

df['date'] = df[0].apply(convert)
print(df)

                     0        date
0                  123         123
1  2018-01-02 00:00:00  2018/01/02
2  2018-01-03 00:00:00  2018/01/03
3  2018-01-04 00:00:00  2018/01/04
4  2018-01-05 00:00:00  2018/01/05
5  2018-01-06 00:00:00  2018/01/06

Примечание: может быть, лучше сначала очистить даты, чтобы избежать неожиданного поведения. Например с этим

df[df[0].apply(lambda x: type(x)==pd._libs.tslibs.timestamps.Timestamp)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...