Изменение даты на полпути через CSV с ГГГГ-ММ-ДД на ДД / ММ / ГГ и после переключения даты и времени больше не работает - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть CSV дневных данных о температуре с 3 столбцами: даты, дневные максимальные температуры и дневные минимальные температуры.Я приложил это здесь, чтобы вы могли видеть, что я имею в виду.

Я пытаюсь разбить этот набор данных на меньшие наборы данных по 30-летним периодам.В течение первых нескольких лет Old.csv даты вводятся в формате ГГГГ-ММ-ДД, но затем переключаются на ДД / ММ / ГГ в 1900 году. После того, как этот формат даты переключает мой код для разделения лет, больше не работает.Вот что я использую:

df2 = pd.read_csv("Old.csv")

test = df2[
    (pd.to_datetime(df2['Date']) >
        pd.to_datetime('1897-01-01')) &
    (pd.to_datetime(df2['Date']) <
        pd.to_datetime('1899-12-31'))
]

, и это работает ... НО, когда я переключаюсь на 1900 и дальше, он останавливается.Так что этот не работает:

test = df2[
    (pd.to_datetime(df2['Date']) >
        pd.to_datetime('1900-01-01')) &
    (pd.to_datetime(df2['Date']) <
        pd.to_datetime('1905-12-31'))
]

Приведенный выше код дает мне пустой набор данных, несмотря на то, что он работал до 1900 года. Я предполагаю, что это какая-то проблема форматирования, но я подумал, что с помощью ".to_datetime"бы исправить это.Я также попробовал это:

df2['Date']=pd.to_datetime(df2['Date'])

, чтобы переформатировать весь список до того, как я запустил приведенный выше код, но он все еще не работал.Другая интересная вещь состоит в том, что у меня есть отдельный csv с датами, последовательно введенными как MM / DD / YY, и тот работает с кодом выше.Может ли это быть проблемой на рубеже веков?Кто-нибудь знает, как это исправить?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Python читает 00 как 2000 вместо 1900. Поэтому я попытался отредактировать 00 так, чтобы он читался как 1900:

df2.Date.dt.year.replace(2000, 1990, inplace=True)

Но python возвратил ошибку, в которой указанные даты не доступны для непосредственного редактирования.Затем я изменил их на строку и отредактировал таким образом, используя:

df2['Date'] = df2['Date'].str.replace(r'00', '1900')

Это работает, но теперь мне нужно найти способ перебрать 1896-1968 без необходимости каждый раз печатать эту строку.

0 голосов
/ 02 декабря 2018

Вы имеете дело с данными времени / даты в разных форматах, для этого вы могли бы использовать более гибкий анализатор, например dateutil.parser

Пример:

>>> from dateutil.parser import parse
>>> df
         Date
0  1897-01-01
1  1899-12-31
2    01/01/00

>>> df.Date.apply(parse)
0   1897-01-01 00:00:00
1   1899-12-31 00:00:00
2            2000-01-01
Name: Date, dtype: datetime64[ns]

и используйте вашу функцию для проанализированных данных.

Как отмечено в комментарии выше, все еще неясно, относится ли год "00" к 1900 или 2000 году, но, возможно, вы можете сделать вывод, что из контекста CSVфайл.

Чтобы изменить все годы в формате «ДД / ММ / ГГ» на 1900 дат, вы можете определить собственную функцию разбора

>>> def my_parse(d):
...   if d[-3]=='/':
...     d = d[:-3]+'/19'+d[-2:]
...   return parse(d)

>>> df.Date.apply(my_parse)
0   1897-01-01
1   1899-12-31
2   1900-01-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...