根据月份,按月和日创建日期时间列

时间:2018-05-04 20:22:27

标签: python pandas datetime dataframe string-to-datetime

我有mm-dd格式的日期的柱状数据,如图所示。我需要添加正确的年份(日期为10月到12月是2017年,日期是1-1之后是2018年)并制作日期时间对象。下面的代码有效,但它很难看。是否有更多的Pythonic方法来实现这一目标?

import pandas as pd
from datetime import datetime
import io

data = '''Date
1-3
1-2
1-1
12-21
12-20
12-19
12-18'''

df = pd.read_csv(io.StringIO(data))

for i,s in enumerate(df.Date):
    s = s.split('-')
    if int(s[0]) >= 10:
        s = s[0]+'-'+s[1]+'-17'
    else:
        s = s[0]+'-'+s[1]+'-18'
    df.Date[i] = pd.to_datetime(s)
    print(df.Date[i])

打印:

2018-01-03 00:00:00
2018-01-02 00:00:00
2018-01-01 00:00:00
2017-12-21 00:00:00
2017-12-20 00:00:00
2017-12-19 00:00:00
2017-12-18 00:00:00

2 个答案:

答案 0 :(得分:2)

这是使用pandas矢量化功能的一种方式:

df['Date'] = pd.to_datetime(df['Date'] + \
             np.where(df['Date'].str.split('-').str[0].astype(int).between(10, 12),
                      '-2017', '-2018'))

print(df)

        Date
0 2018-01-03
1 2018-01-02
2 2018-01-01
3 2017-12-21
4 2017-12-20
5 2017-12-19
6 2017-12-18

答案 1 :(得分:2)

您可以将日期转换为pandas nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf 个对象。然后使用datetime修改其年份。有关详细信息,请参阅docs

您可以使用以下代码:

datetime.replace

输出:

df['Date'] = pd.to_datetime(df['Date'], format="%m-%d")
df['Date'] = df['Date'].apply(lambda x: x.replace(year=2017) if x.month in(range(10,13)) else x.replace(year=2018))