Pandas 现在使用时区填充datetime列
我有一个带有Pandas 现在使用时区填充datetime列,pandas,datetime,python-3.6,Pandas,Datetime,Python 3.6,我有一个带有None值的pandas datetime列,我想在特定时区中填充datetime.now() 这是我的MWE数据帧: df = pd.DataFrame([ {'end': "2017-07-01 12:00:00"}, {'end': "2017-07-02 18:13:00"}, {'end': None}, {'end': "2017-07-04 10:45:00"} ]) 如果我填写fillna: pd.to_datetime(df['en
None
值的pandas datetime列,我想在特定时区中填充datetime.now()
这是我的MWE数据帧:
df = pd.DataFrame([
{'end': "2017-07-01 12:00:00"},
{'end': "2017-07-02 18:13:00"},
{'end': None},
{'end': "2017-07-04 10:45:00"}
])
如果我填写fillna
:
pd.to_datetime(df['end']).fillna(datetime.now())
df['end'] = pd.to_datetime(df['end'])
df['end'] = df['end'].fillna(pd.to_datetime(pd.datetime.now(pytz.timezone('US/Pacific'))))
print (df)
end
0 2017-07-01 12:00:00
1 2017-07-02 18:13:00
2 2017-07-04 03:35:08.499418-07:00
3 2017-07-04 10:45:00
print (df['end'].apply(type))
0 <class 'pandas._libs.tslib.Timestamp'>
1 <class 'pandas._libs.tslib.Timestamp'>
2 <class 'pandas._libs.tslib.Timestamp'>
3 <class 'pandas._libs.tslib.Timestamp'>
Name: end, dtype: object
结果是一个具有预期数据类型的系列:datetime64[ns]
。但当我指定时区时,例如:
pd.to_datetime(df['end']).fillna(
datetime.now(pytz.timezone('US/Pacific')))
这将返回一个数据类型为的序列:
object
您似乎需要在fillna
中将date
转换为到
:
pd.to_datetime(df['end']).fillna(datetime.now())
df['end'] = pd.to_datetime(df['end'])
df['end'] = df['end'].fillna(pd.to_datetime(pd.datetime.now(pytz.timezone('US/Pacific'))))
print (df)
end
0 2017-07-01 12:00:00
1 2017-07-02 18:13:00
2 2017-07-04 03:35:08.499418-07:00
3 2017-07-04 10:45:00
print (df['end'].apply(type))
0 <class 'pandas._libs.tslib.Timestamp'>
1 <class 'pandas._libs.tslib.Timestamp'>
2 <class 'pandas._libs.tslib.Timestamp'>
3 <class 'pandas._libs.tslib.Timestamp'>
Name: end, dtype: object
我认为解决方案是将参数utc
传递给:
utc:布尔值,默认为无
如果为True,则返回UTC DatetimeIndex(同时转换任何tz感知的datetime.datetime对象)
什么是期望输出?列中是否需要混合时区?utc with
US/Pacific
?请注意,这样做会将所有时间戳转换为该时区,最终结果是正确的,如果您查看任何特定元素值,它是带有所需时区信息的时间戳。只是numpy没有支持此功能的数据类型,但是数据类型是timestamp,并且支持数字操作。这会立即返回UTC,而不是在指定的时区中。若需要datetime64,那个么若一些日期包含时区,而另一个日期不包含时区,那个么使用datetime64数据类型是一个问题。如果所有日期都有时区或者没有时区信息,它就可以很好地工作。此外,我发现这一点-警告:直接将时区传递给datetime.datetime构造函数是不正确的(例如,datetime.datetime(2011,1,1,tz=timezone('US/Eastern'))。相反,需要使用时区上的本地化方法对日期时间进行本地化。
谢谢!通过使用时区定义to_datetime
解决:df['end']=pd.to_datetime(df['end'])。dt.tz_本地化('US/Pacific')
。fillnaSupeeer,我将其添加到答案中。
df['end'] = pd.to_datetime(df['end']).dt.tz_localize('US/Pacific')
df['end'] = df['end'].fillna(pd.datetime.now(pytz.timezone('US/Pacific')))
print (df.end.dtype)
datetime64[ns, US/Pacific]