我有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
答案 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))